下面这个正则表达式是什么意思?
本文关键字:是什么 意思 正则表达式 | 更新日期: 2023-09-27 18:05:43
刚刚遇到了下面这个正则表达式:
Regex.Match(feed.Element("description").Value, @"^.{1,180}'b(?<!'s)").Value
我知道它说从任何东西开始它应该包含最少1和最多180个字符'b
代表单词边界。我不明白'b
在这里做什么。然后是(?<!'s)
。这个表达在做什么??<!
代表向后看,不消耗字符串。我猜它说的是向后看,它不应该以太空结束。但我不确定。谁能澄清这些疑问?
在Regexr上查看您的表达式,这是一个测试正则表达式的有用工具。
为了测试,我将最大长度减少到10。所以它看起来像
^.{1,10}'b(?<!'s)
(?<!'s)
是对零长度断言的否定。这意味着它会检查前面(左边)的位置是否为空白。
因此,^.{1,10}'b(?<!'s)
将在字符串的前10个字符的最后一个单词边界处匹配,但前提是左侧部分或单词边界不是空白。这不仅将匹配"左词边界"(我认为tripleee是指单词的右侧),因为单词边界不一定包括空白。
一个词边界'b
将匹配一个词字符(由类'w定义)和一个非词字符'w之间的空字符串
这意味着'b(?<!'s)
将匹配例如"A$","A","(A)"或"A"。它们之间都有一个词边界,并且左边的字符不是空白。
在您的示例中,(?<!'s)
确保在匹配
用下面的方法来说明很容易。在示例中将180改为10,这样就不需要很长的测试字符串了:
^.{1,10}'b(?<!'s)
现在尝试匹配下面的字符串(注意2和3之间有两个空格):
one two three four
正则表达式匹配将不包括2和3之间的两个空格。但是,如果像这样删除正则表达式的最后一部分:
^.{1,10}'b
则两个后面的两个空格将包含在匹配中
基本上,"非空白"断言强制'b只匹配左单词边界。因此,换句话说,如果前180个字符包含在第一列之后的任何位置开始的单词,则此匹配。(表达式在匹配之前至少需要一个任意字符——如果没有上下文,很难说这是否真的正确,以及它到底应该完成什么。)