Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

正则表达式 #33

Closed
yaofly2012 opened this issue Nov 30, 2018 · 1 comment
Closed

正则表达式 #33

yaofly2012 opened this issue Nov 30, 2018 · 1 comment

Comments

@yaofly2012
Copy link
Owner

  1. 元字符作为一般字符匹配时需要转移;
  2. 除了可以匹配字符外,还可以匹配位置,即图中【位置匹配】部分;
  3. 量词
  • 修饰【字符匹配】,【捕获分组】,【非捕获分组】,【前瞻】;
  • 不能修改【位置匹配】(包含后瞻);
    可以包成分组进行匹配。
  1. 【候选】的优先级最低;
  2. 【位置匹配】
  • 都是0宽度,不影响匹配位置;
  • 可以对同一个位置同时进行多个匹配模式,相当于该位置要满足所有的匹配模式。
 /^^hello\b(?!\w)/.test("hello "); // true 

位置匹配^重复匹配一个位置,相当于一个位置匹配;
位置匹配\b(?!\w)都是对同一个位置进行匹配,字符b后面的位置即是个单词结尾又是非单词字符(本例是空格字符)的前面

  • 密码规则校验问题
    密码字符集一般是有安全要求的,比如:必须包含数字,大小写字母等。可以使用【位置匹配】:
// 规则1 = 长度6到15位,必须是数字,字母,下划线,感叹号,中划线
/^[0-9a-zA-Z_!-]{6,15}$/.test('abc123'); // true,很容易实现

// 规则2 = 规则1 + 必须包含大写字母
/(?=.*[A-Z])^[0-9a-zA-Z_!-]{6,15}$/.test('abc123'); // false
/(?=.*[A-Z])^[0-9a-zA-Z_!-]{6,15}$/.test('abC123'); // true

// 规则3 = 规则2 + 必须包含下划线
/(?=.*_)(?=.*[A-Z])^[0-9a-zA-Z_!-]{6,15}$/.test('abC123'); // false
/(?=.*_)(?=.*[A-Z])^[0-9a-zA-Z_!-]{6,15}$/.test('abC123_'); // true

原理就是通过找满足条件的位置来判断目标字符串是否符合指定的规则。规则2(规则3同理)的正则表达式相当于对起始位置添加了多个匹配条件。
6. 回溯
为了判断是否匹配完成,进行了一些尝试。尝试的副作用就是造成回溯(造成匹配位置倒退的行为)。
回溯会影响性能,写正则尽量规避造成回溯。

参考

  1. 《JavaScript正则迷你书》
@yaofly2012
Copy link
Owner Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant