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

正则表达式 #5

Open
791045873 opened this issue Nov 26, 2018 · 0 comments
Open

正则表达式 #5

791045873 opened this issue Nov 26, 2018 · 0 comments

Comments

@791045873
Copy link
Owner

该总结源于JavaScript正则表达式迷你书

一句话解释什么是正则

正则是一种匹配模式。要么匹配字符串,要么匹配位置

两种匹配方向

横向匹配纵向匹配

量词

{}、?、+、*。量词单位具体含义不再解释。

####贪婪匹配与惰性匹配
默认情况下都是贪婪匹配。
若想触发惰性匹配,需要在量词后加“?”

多选分支

“|”,管道符分隔不同分支。
注意,管道符默认为惰性,即,管道符前边的模式匹配上了,就不会再去匹配后边的模式。
再次注意,管道符优先级最低。(牢记)

几种简写方式

  • \d [0-9],表示所有数字。 \D
  • \w a-zA-Z0-9_] 表示所有数字字母和下划线。 \W
  • \s 匹配空白符 \S
  • . 通配符

注意,大写字母对应的模式为小写字母的反面。即“\D”匹配所有的不是数字的内容。

匹配位置(六个位置的锚)

  • ^匹配开头
  • $ 匹配结尾
  • \b 匹配所有的单词边界(即,\w与\W,\w与^,\w与$之间的位置)
  • \B 匹配所有非单词边界。记住,大小写表示的含义是相反的(具体位置为,\w与\w,\W与\W,\W与^,\W与$之间的位置)
  • (?=p) 匹配p之前的位置(也可以理解为:该位置之后为p)。建议使用括号里的方式理解。因为,位置不仅可以通过p来规定,也会受到正则表达式里的其他元素的影响。
// 举个例子
// 看如下正则:

/(?=.*[0-9])^/

// 根据正则的语法可以看出“.*[0-9]”是一个整体,代表(?=p)里的p,根据上文中的定义。
// 可以理解为:表达式(?=.*[0-9])匹配一个位置,该位置后边是任意多个字符,再加上一个数字。
// ^符号代表开头。而在整个表达式中,因为^的存在,限制了(?=.*[0-9])这个表达式存在的位置,即,只 
// 能在开头部分。
// 所以,表达式整体匹配规则为:该字符串从开头开始有任意多个字符,后接一个数字。
// 简单来讲,就是字符串必须有数字。
// 这个例子告诉我们,(?=p)的位置是会由其他元素影响的。(牢记重点,这是我之前一直不理解的)
  • (?!p) 匹配不是p前面的位置(即:该位置之后不是p)

括号

分组
分组引用
  • ?: ,分组不引用。举例:(?:x),该分组将无法被引用
  • ?。name为该分组的命名。
  • \k。 用name引用对应分组
  • 提取数据。$1,$2......$9,还有特殊的$0。1-9对应9个分组,0对应整体匹配。
  • 替换。API replace中可以使用$0-9
  • 反向引用。即,在正则表达式中引用之前的分组,达到复用的功能。
反向引用

需要注意以下几点:

  • 若出现括号嵌套,则引用顺序为从前向后,从外向内。
  • 引用不存在的分组,则转义本身。
  • 分组后有量词,则分组指代最后一个匹配。

回溯

回溯是正则的匹配原理,文字叙述太麻烦。请自己看书喽。

正则优先级

  1. 转义
  2. 括号 方括号
  3. 量词
  4. 位置 普通元素
  5. 管道符
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