-
针对正则匹配 资料
-
常用
- 构造函数形式 new RegExp(/^[0-9]*$/, 'g')
- 字面量形式 /^[0-9]\d*$/g
判断是否匹配正则表达式:
- /regexp/.test('str') 正则判断 ; 返回true/false
- str.search(regex) 返回找到的索引/,-1
- str.trim() 去除空格
- str.match(regexp) 返回匹配到字符串信息的数组
- str.replace(regexp/newSubStr,newSubStr/fn) 替换
| 元字符 | |
|---|---|
| . | 匹配任意字符 |
| {m,n} | 匹配出现m到n次的字符'hello wohhrld'.match(/h{1,5}/g);匹配了["h", "hh"] ;可以省略第二个参数。 例如,[0-9]{2,} 匹配至少两位 0~9 的数字。 |
| [] | 匹配字符集[tT],匹配t或者T |
| [^] | 反向匹配不包含字符集[tT],匹配t或者T以外的字符 |
匹配一个空格 'abc'.match(/^/)返回['', index: 0, input: 'abc', groups: undefined] | |
| | 或则 'abc'.match(/a|b/) 匹配字符串a或则b,返回['a', index: 0, input: 'abc', groups: undefined] |
| * | 前一项出现零次或者多次 {0,n} |
| + | 前一项出现一次或者多次 {1,n} |
| ? | 前一项出现零次或者一次 {0,1} |
| 匹配以...开头的字符 | |
| $ | 匹配以...结尾的字符 |
| \d | 数字 ; /^[0-9]\d*&/ 匹配整数 |
| \D | 非数字,\d的反义 |
| \s | 匹配一个空白字符 |
| \S | 反义的\s |
正则分组
| 正则分组 | 含义 |
|---|---|
| () | 将()内的内容进行分组匹配 |
| (?:) | 如果不想将分组括号中的内容输出出来,可以加上 ?: 表示非匹配分组 |
node内置库中的一个案例
/**
* 匹配request结尾字符是否/,
* 如果不为/, 判断是否为/.. /. .. . 结尾的相对路径
*/
const CHAR_FORWARD_SLASH = 47;
let trailingSlash = request.length > 0 &&
request.charCodeAt(request.length - 1) === CHAR_FORWARD_SLASH;
const trailingSlashRegex = /(?:^|\/)\.?\.$/;
trailingSlash = RegExpPrototypeTest(trailingSlashRegex, request); //RegExpPrototypeTest等同于str.test(rep);
- 理解一下
/(?:^|\/)\.?\.$/正则表达式
const trailingSlashRegex = /(?:^|\/)\.?\.$/;
// \. 匹配 .
// ?匹配一个没有.或则一个.
// \.?\.$ 匹配 . ..结尾
// ^匹配一个空格,
// ^|\/ 匹配一个空格或者/
// 所以这行正则匹配的是 . .. /. /.. 四种情况
str.match
node内置库中一个使用方式:
// This only applies to requests of a specific form:
// 1. name/.*
// 2. @scope/name/.*
const EXPORTS_PATTERN = /^((?:@[^/\\%]+\/)?[^./\\%][^/\\%]*)(\/.*)?$/;
function resolveExports(nmPath, request) {
// The implementation's behavior is meant to mirror resolution in ESM.
const [, name, expansion = ''] =
StringPrototypeMatch(request, EXPORTS_PATTERN) || [];
if (!name) {
return false;
}
let rep = /(^|\/)\.?\.$/;
let _rep = /(?:^|\/)\.?\.$/;
'/..'.match(rep); // ['/..', '/', index: 0, input: '/..', groups: undefined]
'/..'.match(_rep); // ['/..', index: 0, input: '/..', groups: undefined] 分组前面加上?: 后,执行了分组,但是分组的匹配不会被输出出来
_rep.test('/..'); // true
面试题
将url转换为JSON格式:
将URL转换为JSON格式:想要截取字符串使用字符串的API,substring+indexOf
function parseQueryString(url) {
var obj = {};
var keyvalue = [];
var key = "",
value = "";
var paraString = url.substring(url.indexOf("?") + 1, url.length).split("&");
for (var i in paraString) {
keyvalue = paraString[i].split("=");
key = keyvalue[0];
value = keyvalue[1];
obj[key] = value;
}
return obj;
}