断言 :表示一个匹配在某些条件下发生。断言包含先行断言、后行断言和条件表达式。
字符类 :区分不同类型的字符,例如区分字母和数字。
组和范围:表示表达式字符的分组和范围。
量词 :表示匹配的字符或表达式的数量。
UniCode转义 :基于 unicode 字符属性区分字符。例如大写和小写字母、数学符号和标点。
? 非贪婪 、贪婪模式 ;
如果?紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对 "123abc" 使用 /\d+/ 将会匹配 "123"(贪婪模式),而使用 /\d+?/ 则只会匹配到 "1" (非贪婪模式)。
(x)
括号,它在正则表达式中常用作记忆设备。即这部分所匹配的字符将会被记住以备后续使用
其中括号被称为捕获括号。
模式/(foo) (bar) \1 \2/
中的 '(foo)
' 和 '(bar)
' 匹配并记住字符串 "foo bar foo bar" 中前两个单词。模式中的\1
和\2
表示第一个和第二个被捕获括号匹配的子字符串,即foo
和bar
,匹配了原字符串中的后两个单词。注意\1
、\2
、...、\n
是用在正则表达式的匹配环节,详情可以参阅后文的 \n 条目。而在正则表达式的替换环节,则要使用像$1
、$2
、...、$n
这样的语法,例如,'bar foo'.replace(/(...) (...)/, '$2 $1')
。$&
表示整个用于匹配的原字符串。
image.png
交换字符串位置 demo
image.png
x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言
例如,/Jack(?=Sprat)/会匹配到'Jack'仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。
(?<=y)x 匹配'x'仅当'x'前面是'y'.这种叫做后行断言。
例如,/(?<=Jack)Sprat/会匹配到' Sprat '仅仅当它前面是' Jack '。/(?<=Jack|Tom)Sprat/匹配‘ Sprat ’仅仅当它前面是'Jack'或者是‘Tom’。但是‘Jack’和‘Tom’都不是匹配结果的一部分。
x(?!y) 仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找。
例如,仅仅当这个数字后面没有跟小数点的时候,/\d+(?!.)/ 匹配一个数字。正则表达式/\d+(?!.)/.exec("3.141")匹配‘141’而不是‘3.141’
(?<!y)x 仅仅当'x'前面不是'y'时匹配'x',这被称为反向否定查找。
例如, 仅仅当这个数字前面没有负号的时候,/(?<!-)\d+/ 匹配一个数字。
/(?<!-)\d+/.exec('3') 匹配到 "3".
/(?<!-)\d+/.exec('-3') 因为这个数字前有负号,所以没有匹配到。
网友评论