有人能解释一下正则表达式元字符\b
和\w
之间的区别吗?据我所知,这两个元字符都用于单词边界。除此之外,哪一个元字符对于多语言内容更有效?
有人能解释一下正则表达式元字符\b
和\w
之间的区别吗?据我所知,这两个元字符都用于单词边界。除此之外,哪一个元字符对于多语言内容更有效?
\b
与插入符号和美元符号一样,是一种锚点。它匹配的位置称为"单词边界"。此匹配长度为零。
有三个不同的位置可以作为单词边界:
简而言之: \b
允许您使用形式为\bword\b
的正则表达式执行“仅限整个单词”搜索。 “单词字符”是可以用于形成单词的字符,所有不是“单词字符”的字符都是“非单词字符”。
在所有情况下,字符 [a-zA-Z0-9_]
都是单词字符。 这些也由简写字符类 \w
匹配。 在口味比较中显示“ascii”的单词边界只认识这些作为单词字符。
\w
代表“单词字符”,通常是 [A-Za-z0-9_]
。 注意包含下划线和数字。
\B
是 \b
的否定版本。 \B
与 \b
不匹配的每个位置匹配。 实际上, \B
在两个单词字符之间的任何位置以及在两个非单词字符之间的任何位置匹配。
\W
是 [\ ^\w]
的简写,也就是 \w
的否定版本。
\w
匹配一个单词字符。 \b
是一个零宽度匹配,匹配一个位置字符,在这一侧有一个单词字符,另一侧是不是单词字符的东西。(不是单词字符的例子包括空格、字符串的开头和结尾等)
\w
在 "abc def"
中匹配 a
、b
、c
、d
、e
和 f
\b
在 "abc def"
中匹配(零宽度的)位置,分别是 a
前面、c
后面、d
前面和 f
后面。
\b
是一个零宽断言,它匹配的不是字符,而是位置。 - Alan Moore@Mahender,你可能指的是\W
(而不是\w
)和\b
之间的区别。如果不是,那么我同意上面@BoltClock和@jwismar的观点。否则请继续阅读。
\W
将匹配任何非单词字符,因此很容易尝试使用它来匹配单词边界。问题在于它不会匹配行的开头或结尾。\b
更适合匹配单词边界,因为它也会匹配行的开头或结尾。粗略地说(更有经验的用户可以纠正我),\b
可以被认为是(\W|^|$)
。[编辑:如下面的@Ωmega所提到的,\b
是零长度匹配,因此(\W|^|$)
并不严格正确,但希望能够解释清楚区别]
快速示例:对于字符串Hello World
,.+\W
将匹配Hello_
(带有空格),但不会匹配World
。.+\b
将匹配Hello
和World
。
\b
与(\W|^|$)
的含义相同,因为(\W|^|$)
将包括匹配结果中的非单词字符。您可以在此处检查此事实=> https://regexr.com/3qf98。 - Victor\b
在模式前使用时与 (?<=\W|^|$)
相同,在模式后使用时与 (?=\W|^|$)
相同。你可以在这里检查我所说的 => https://regexr.com/3qf9h。只需将其与此处的 \b
锚点结果进行比较 => https://regexr.com/3qf9t - Victor\b <= this is a word boundary.
匹配一个位置,它后面是一个单词字符但前面不是单词字符,或者它前面是一个单词字符但后面不是单词字符。
\w <= stands for "word character".
它总是匹配ASCII字符[A-Za-z0-9_]
您有什么具体的要匹配的内容吗?
对于初学者或只是想了解正则表达式的人来说,以下是一些有用的regex网站。
我发现这本书非常有用:
\w
并不总是等同于ASCII字符 [A-Za-z0-9_]
-- 它也会匹配包括字母数字的Unicode编码点,并且如果区域设置适当,可能会匹配8位ISO-Latin-1字符。 - Tim Pierce\w
不是单词边界,它匹配任何单词字符,包括下划线:[a-zA-Z0-9_]
。 \b
是单词边界,即它匹配单词和非字母数字字符之间的位置:\W
或 [^\w]
。
虽然这些实现可能因语言而异。
\w
代表单词字符,而\b
代表单词字符和非单词字符之间的边界。它们并不是同一件事情。 - BoltClock