2.1.1 基础正则表达式
通配符经常和星号一起使用,表示“任何字符串”。
.*
表示任何字符串。
锚点
锚点是将正则表达式锚定在字符串中特定位置的特殊字符,即表示位置
1.插入符^
:有三种用途:匹配行首,在方括号内表示否定,以及仅仅表示该符号。
2.美元符号 $
:匹配行尾。所以,$
($
前有一个空格) 就表示匹配行末的空格。
eg: /^The dog\.$/
匹配只包含 The dog. 的行。(我们必须在这里使用反斜杠,因为我们希望 . 表示“句号”,而不是通配符。)
3.\b
匹配一个词的边界, \B
匹配非边界。因此,/\bthe\b/ 匹配的是单词 the,而不是单词 other。
从技术上讲,正则表达式中所说的“词”,是指任何由数字、下划线或字母构成的序列;这种定义是基于编程语言中“词”(译者注:标识符)的定义的。例如,/\b99\b/ 将会匹配到 There are 99 bottles of beer on the wall 中的 99(因为 99 前面是空格),但不会匹配到 There are 299 bottles of beer on the wall(因为 99 前面是数字)。但会匹配到 $99
中的 99(因为 99 前面跟着一个美元符号 $
,而不是数字、下划线或字母)。(译者注:99 前面跟着 $
,而 $
不属于词的构成元素,所以被视为边界 boundary,所以才会匹配到 $99,同样也会匹配到 ^99。所以特别注意,并不是空格才会被视为边界。)
2.1.2 逻辑或、组合和优先级
管道符|
:/cat|dog/
就可以匹配字符串 cat 或 dog 了
/gupp(y|ies)/
将表示 | 只作用于后缀 y 和 ies,即匹配guppy 或guppies。
一个运算符可能优先于另一个运算符,这就要求我们有时要用括号来表达我们的意图,这种做法是通过运算符优先级(operator precedence hierarchy)来实现的。
因此,由于 counters 比 sequences 具有更高的优先级,所以 /the*/ 会匹配到 theeeee 而不是 thethe。由于 sequences 的优先级高于 disjunction,所以 /the|any/ 会匹配到 the 或者 any,但不会匹配到 thany 或 theny。
2.1.6 替换,捕获组(Capture Groups)和 ELIZA
1.替换
s/regexp1/pattern/
,可用另一个字符串替换一个由正则表达式表示的字符串
2.捕获组
/the (.*)er they (.*), the \1er we \2/
会匹配到 the faster they ran, the faster we ran,但不会匹配到 the faster they ran, the faster we ate。同样,第三个捕获组存储在 \3,第四个是 \4,以此类推。
因此,小括号在正则表达式中具有双重功能;它们可用于分组,以指定运算符的执行顺序。它们还可用于捕获内容以放到寄存器中。但有时我们可能想使用括号进行分组,但又不想存储到寄存器中。在这种情况下,我们可以使用一个非捕获组(non-capturing group),把命令 ?: 放在左括号后,形式是 (?: pattern )。
/(?:some|a few) (people|cats) like some \1/
将会匹配到 some cats like some cats,但不会匹配到 some cats like some a few。(\1 指的是 (people|cats))
ELIZA 的工作原理是一系列的正则表达式替换,每一个替换都会匹配并改变输入的某些部分。输入行首先是大写的。输入首先会被替换成大写形式。第一组替换将所有的 MY 改为 YOUR,I'M 改为 YOU ARE,以此类推。
2.1.7 先行断言(Lookahead Assertions)
菜鸟教程:https://www.runoob.com/w3cnote/reg-lookahead-lookbehind.html