正则表达式中\b和\s的区别

15

我正在学习iOS中的正则表达式,并看到了这个教程:http://www.raywenderlich.com/30288/nsregularexpression-tutorial-and-cheat-sheet

对于\b,内容如下:

\b匹配单词边界字符,例如空格和标点符号。to\b将匹配“to the moon”和“to!”中的“to”,但不会匹配“tomorrow”。\b很适合用于“整个单词”类型的匹配。

而\s,则如下所示:

\s匹配空白字符,例如空格、制表符和换行符。hello\s将匹配"Well, hello there!"中的"hello "。

我有两个问题:

1) \s和\b之间有什么区别?应该在什么情况下使用它们?

2) \b非常适合“整个单词”类型的匹配->不明白这句话的意思..

希望能得到关于这两个问题的指导。


正则表达式中的断言就像传统编程中的“IFs”一样。foo\b匹配的是紧跟着非单词字符的“foo”。 - georg
@thg435 首先感谢.. 我有一个问题要问。正则表达式中的断言是什么?你有任何例子吗? - lakshmen
在你的问题中,\b 是一种断言。其他示例包括像 ^$ 和环视这样的锚点。 - georg
4个回答

25

\b 边界字符

\b 匹配边界本身,但不匹配边界字符(如逗号或句号)。它本身没有长度,但可以用于查找例如单词结尾的 e

例如在这个句子中:“Hello there, this is one test. Testing”

正则表达式 e\b 将匹配以 e 结尾的单词(后面跟着一个单词边界)。请注意下面的图片中,“test”和“Testing”的 e 没有匹配成功,因为“e”后面没有跟随边界。

enter image description here

\s 空白字符

\s 与实际空白字符(如空格和制表符)相匹配。在同一个句子中,它将匹配所有单词之间的空格。

enter image description here


编辑

由于\b 单独使用没有太多意义,所以上面展示了如何使用 e\b。(上面的内容)评论区里的问题是关于 e\se\b 的区别,为了更好地解释 \b\s 之间的差异。

在同一个字符串中,e\s 只有一个匹配项,而 e\b 有两个匹配项,因为逗号不是空格。请注意,e\s 匹配(图像3)包括空格,而 e\b 匹配(图像1)则不包括空格。

enter image description here


1
@lakesh e\s 将匹配两个字符。而 e\b 只会匹配一个字符。这两者的比较可能会更好地解释 e\b\s 的区别。 - Sulthan

3
  • \b 匹配一个单词边界。这是一个零宽度断言,意味着它不匹配字符,而是匹配一个条件为真的位置。

    \b\w 相关。 \w 定义了“单词字符”,即字母、数字和下划线。因此,\b 现在匹配从单词字符到非单词字符的转换,或者反过来。这意味着它匹配单词的开头和结尾,但不匹配单词前面或后面的字符。

  • \s 是一个预定义字符类,可以匹配任何空格字符

在Regexr上查看并尝试匹配\bFoo\b的内容

在Regexr上查看并尝试匹配\sFoo\s的内容


首先感谢您的回复。您使用 /\bFoo 是为了什么?为什么需要额外的 /?能向我解释一下吗? - lakshmen
抱歉,那是Perl语法,只是一个正则表达式的分隔符,但我只在一个表达式中使用了它。已删除。 - stema

2

\b是零宽度的,也就是说它实际上不匹配任何字符。而\s则匹配一个字符。这对于捕获和更复杂的正则表达式非常重要。

例如,假设您想匹配以多个零开头的数字,如007000101101。您可以尝试使用以下正则表达式:

0+\d*

但是请注意,这也会匹配1007101000101101!所以,你可以尝试:

\s0+\d*

但是,你看这样就无法匹配字符串开头的007(因为没有空格字符),使用\b可以让你获取“整个单词(或数字)”:

\b0+\d*

0

\b 匹配任何不是字母或数字的字符,但不包括自身在匹配中。

\s 仅匹配空格。

例如: \b 可以匹配这些任意一个字符:"!?,.@#$%^&*()_+ "。

$text = "Hello, Yo! moo .";
$regex = "~o\b~";

^---将匹配所有三个o。

$text = "Hello, Yo! moo .";
$regex = "~o\s~";

^---只匹配“moo”中的“o”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接