22-正则⾼级应⽤:匹配⼀⾏完整的字符串
在做正则匹配的时候,有时候我们想到匹配结果所处的⾏,⽽不是仅仅包含匹配结果。例如在⽂本编辑器中,我们搜索包含单词 John 所在的⾏,并将改⾏删除。
⾏中包含指定单词
在上⾯这个例⼦中我们可以使⽤表达式John来匹配字符 John ,但是匹配结果仅包含 john ,⽽不是 john 所在的⼀整⾏。
解决⽅法很简单。我们可以使⽤^$去匹配⾏的开始和结束,并且需要开启多⾏模式匹配(在JavaScript中多⾏模式是m)来匹配⽂件内部的换⾏符。接下来我们要匹配字符串中除了 john 以外的部分,这⾥可以使⽤.*,表达式为:^.*John.*$。
⾏中包含任意⼀个指定单词
如果要匹配的字符有多种可能,我们可以使⽤。例如表达式^.*\b(one|two|three)\b.*$可以匹配包含单词 one、two、three 中任意⼀个的⾏。这个表达式中的将保存实际匹配到的单词。如果这⾏数据包含多个符合条件的单词,那么回溯引⽤会捕获最靠右的单词,这是因为星号*是的。如果使⽤了⾮贪婪匹配,例如^.*?\b(one|two|three)\b.*$,那么回溯引⽤将捕获最靠左的单词。
确保⼀⾏中同时包含多个单词
如果要在⼀⾏中同时匹配多个单词,我们可以使⽤。表达式^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$可以匹配⽂本中完整的⼀⾏,并且其中同时包含三个单词 one、two、three。这个表达式中的位置字符会匹配⼀⾏的开始和结束。并且由于脱字符^和预测断⾔都是零宽的,所以三个预测断⾔都会从⼀⾏的开头开始匹配。在每⼀个预测断⾔内部.*?会匹配⽬标单词之前的所有字符,并且三个预测断⾔必须全部匹配成功,整个表达式才能匹配成功。实际上我们可以在预测断⾔中使⽤任何表达式去实现更复杂的匹配。在三个预测断⾔匹配成功之后,我们使⽤.*$确保匹配结果是⼀个完整的⾏。
确保⼀⾏中不包含指定单词
如果你的匹配条件是:⼀⾏中不包含某些单词,那么应该使⽤负预测断⾔。表达式^((?!regexp).)*$可以匹配⼀⾏完整的字符串,并且字符串中不包含regexp。注意,这⾥和正预测断⾔不同,我同时对负预测和句号使⽤了量词。这是因为使⽤正预测的时候我们只要确保字符串中⾄少包含⼀个指定的单词,⽽负预测要确保字符串的每⼀个位置都不包含指定的单词。所以我们要对字符串的每个位置进⾏测试,以确保每个位置都不能匹配regexp。
确保⼀⾏字符串包含⼀组单词,并且不包含另⼀组
regex匹配最后,你也可以把前两种匹配条件组合在⼀起使⽤:^(?=.*?\bmust-have\b)(?=.*?\bmandatory\b)((?!avoid|illegal).)*$。在这个表达式中前两个正预测可以保证字符串中包含指定的单词,第三个负预测可以确保匹配结果是完整的⼀⾏,并且不包含指定的单词。
如果⽂章出现错误,请给我提Issues - -
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论