我很难理解((?i)\bb.*?\b)
为什么b
返回b-
而不是a b- c
为字符串((?i)\bb\w*\b)
。我也尝试了b
,但这样做效果不错。
更多信息:
我需要匹配文字中的单词。我需要检索所有以字母b
开头的单词。并且'words'几乎是指以b
开头的任何字符串,例如b-
,b'
,b"
,{{1}}等。 “我需要匹配当然不限于例如示例中的空格。
答案 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-
,-c
和c
之间的位置都可以正常工作。
因为你有一个懒惰的量词,并且在b
之后有一个单词边界,这就是你的正则表达式所匹配的所有内容。
不是试图使用单词边界来找到单词的结尾,而是匹配单词字符和破折号,就像这样,这自然会将所有内容与单词的“结尾”匹配:
\bb[-\w]*
答案 2 :(得分:0)
.*?
是最小的,因此b.*?\b
会在b
之后找到第一个单词边界。由于b
是单词字符,而-
不是,因此第一个单词边界位于这些字符之间。
ETA:事实是,regexen不会考虑你的话语'要言语,所以\b
不会为他们工作。你说你的话是'并不总是以空间结束。显然,他们不会以连字符结束。它们如何更准确地结束了?