.*?不匹配单词边界之前的字符

.*? does not match character before word boundary

我很难理解为什么 ((?i)\bb.*?\b) returns b 而不是 b- 字符串 a b- c。我也试过 ((?i)\bb\w*\b),但效果并不好。

更多信息:

我需要匹配文本中的单词。我需要检索所有以字母 b 开头的单词。而 'words' 几乎意味着任何以 b 开头的字符串,例如 bb-b'b" 等。 'words' 我需要匹配当然不限于示例中的 space

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

ETA:事实是,regexen 不会将您的 'words' 视为单词,因此 \b 对它们不起作用。你说你的 'words' 并不总是以 space 结尾。而且,很明显,它们不会以连字符结尾。更确切地说,它们是如何结束的?

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

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

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

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

注意:上面的模式非常简单,带 $ 的最后部分在那里,因此捕获了行尾的最后一个 "b"。

*被称为"greedy"quantifier。它将匹配尽可能多的前面模式的迭代。大多数时候,这正是您想要的,但有时您想要使用 "lazy" 量词,这意味着它将尽可能匹配 few,包括 0.

要构成量词 "lazy",请添加问号:*?+???

现在,答案的下一部分是 word boundaries 的工作原理。单词边界将匹配 位置 ,其中 "word characters"(0-9、a-z 和 _)和 "non-word characters" 之间有一个 "break"。 - 是非单词字符,因此 b--cc 之间的位置都可以。

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

与其尝试使用单词边界来查找单词的结尾,不如像这样匹配单词字符和破折号,这会自然地将所有内容与单词的 "end" 匹配:

\bb[-\w]*

看到一个working example