刚刚遇到以下正则表达式:
Regex.Match(feed.Element("description").Value, @"^.{1,180}\b(?<!\s)").Value
我知道它说从任何东西开始它应该包含最小1个字符和最多180个字符\b
代表字边界。我不明白\b
在这做什么。然后(?<!\s)
。这个表达是做什么的? ?<!
代表后面的观察,不消耗字符串。我的猜测是它看起来背后,它不应该以空间结束。我不确定。任何人都可以清除这些疑虑。
答案 0 :(得分:2)
查看表达式here on Regexr,这是测试正则表达式的有用工具。
我将测试的最大长度减少到10。所以它看起来像
^.{1,10}\b(?<!\s)
(?<!\s)
是零长度断言背后的负面看法。这意味着它检查之前(左侧)的位置是否不是空格。
因此,^.{1,10}\b(?<!\s)
将匹配字符串前10个字符中的最后一个字边界,但前提是左边部分或字边界不是空格。这不仅匹配“左词边界”(我认为三重词意味着词的右侧),因为词边界不一定包括空格。
单词边界\b
将匹配单词字符(由类\ w定义)和非单词字符\ W之间的空字符串。
这意味着\b(?<!\s)
将匹配例如“A $”,“A”,“(A”或“.A”之间。所有这些都在两者之间有一个单词边界,左边的字符不是空格。
答案 1 :(得分:1)
在您的情况下(?<!\s)
确保匹配中不包含尾随空格
通过以下方式说明很容易。在您的示例中将180更改为10,因此您不需要非常长的测试字符串:
^.{1,10}\b(?<!\s)
现在尝试将以下字符串与其匹配(注意两个和三个之间的两个空格):
one two three four
您的正则表达式匹配不包括两个和三个之间的两个空格。但是,如果您删除正则表达式的最后一部分,如下所示:
^.{1,10}\b
然后两个之后的两个空格将包含在匹配中。
答案 2 :(得分:0)
基本上,“not whitespace”断言强制\ b仅匹配左侧字边界。换句话说,如果前180个字符在第一列之后的任何地方包含一个单词,则匹配。 (该表达式在匹配之前至少需要一个任意字符 - 很难说没有上下文,这是否真的是正确的,以及它究竟应该完成什么。)