JS中的正则

391 阅读1分钟
  • 针对正则匹配 资料

  • 常用

    • 构造函数形式 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;
}