。*?与单词边界前的字符不匹配

时间:2015-03-16 15:04:48

标签: c# regex .net-4.5

我很难理解((?i)\bb.*?\b)为什么b返回b-而不是a b- c为字符串((?i)\bb\w*\b)。我也尝试了b,但这样做效果不错。

更多信息:

我需要匹配文字中的单词。我需要检索所有以字母b开头的单词。并且'words'几乎是指以b开头的任何字符串,例如b-b'b",{{1}}等。 “我需要匹配当然不限于例如示例中的空格。

3 个答案:

答案 0 :(得分:1)

这应该会给你想要的结果:

(b.*?)(?:\s|$)

我在a b- c bfdf b32=" dfa b. b---s asd b上测试了它。

似乎你不是在寻找单词,而是以空格(或其他?)字符分隔的字母“b”开头的任何字符串。您的原始模式不起作用,因为“ - ”不符合单词的一部分。祝你好运。

注意:上面的模式非常简单,带有$的最后一部分就是这样,以便捕获最后一个“b”,它位于该行的末尾。

答案 1 :(得分:1)

*被称为“贪婪”quantifier。它将尽可能多地匹配前一个模式的迭代次数。大多数情况下,这正是你想要的,但有时候你想要使用“懒惰”量词,这意味着它将尽可能匹配少数,包括0。

要使量词“懒惰”,请添加问号:*?+???等。

现在,答案的下一部分是word boundaries如何运作。字边界将匹配位置,其中“字符”(0-9,a-z和_)与“非字字符”之间存在“中断”。 -是一个非单词字符,因此b--cc之间的位置都可以正常工作。

因为你有一个懒惰的量词,并且在b之后有一个单词边界,这就是你的正则表达式所匹配的所有内容。

不是试图使用单词边界来找到单词的结尾,而是匹配单词字符和破折号,就像这样,这自然会将所有内容与单词的“结尾”匹配:

\bb[-\w]*

查看working example

答案 2 :(得分:0)

.*?是最小的,因此b.*?\b会在b之后找到第一个单词边界。由于b是单词字符,而-不是,因此第一个单词边界位于这些字符之间。

ETA:事实是,regexen不会考虑你的话语'要言语,所以\b不会为他们工作。你说你的话是'并不总是以空间结束。显然,他们不会以连字符结束。它们如何更准确地结束了?