正则表达式中\ b和\ s之间的差异

时间:2013-06-10 08:59:31

标签: ios regex nsregularexpression

我在iOS学习正则表达式,看过本教程:http://www.raywenderlich.com/30288/nsregularexpression-tutorial-and-cheat-sheet

对于\ b:

,它的内容如下所示
  

\ b匹配单词边界字符,例如空格和标点符号。 to \ b将匹配“to the moon”和“to!”中的“to”,但它与“明天”不匹配。 \ b对于“全字”类型匹配很方便。

和\ s:

  

\ s匹配空格字符,例如空格,制表符和换行符。你好\ s将在“嗯,你好!”中匹配“你好”。

我有两个问题:

1)what is the difference between \s and \b? when to use which?

2)\b is handy for "whole word" type matching -> Don't understand the meaning..

需要对这两者有所指导。

4 个答案:

答案 0 :(得分:19)

\b边界字符

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

例如在句子中:“你好,这是一个测试。测试”

正则表达式e\b将匹配e,如果它位于单词的末尾(后跟单词边界)。请注意,在下图中,“test”和“Testing”中的e不匹配,因为“e”后面没有边界。

enter image description here

\s空白

另一方面,

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

enter image description here


修改

由于\b单独没有多大意义,我向e\b(上图)展示了如何做到这一点。 OP(在评论中)询问e\se\b相比较的内容,以更好地解释\b\s之间的差异。

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

enter image description here

答案 1 :(得分:2)

\b为零宽度。也就是说,它实际上并不匹配任何角色。同时,\s 匹配一个字符。这是捕获和更复杂的正则表达式的重要区别。

例如,假设您要尝试匹配以多个零开头的数字,例如007000101101。你可以试试:

0+\d*

但请注意,这也会匹配1007101000101101!那么,您可以尝试:

\s0+\d*

但是看看它与字符串开头的007不匹配(因为没有空格字符)?使用\b可以获得“整个单词(或数字)”:

\b0+\d*

答案 2 :(得分:2)

  • \bword boundary匹配。这是一个零宽度断言,意味着它不匹配一个字符,匹配一个位置,某个条件为真。

    \b\w有关。 \w定义“单词字符”,表示字母,数字和下划线。所以\b现在匹配从单词字符到非单词字符的变化,或者相反。表示它匹配单词的开头和结尾,但不是单词之前或之后的字符。

  • \spredefined character class,匹配任何空格字符

See and try out what \bFoo\b matches here on Regexr

See and try out what \sFoo\s matches here on Regexr

答案 3 :(得分:0)

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

\s仅匹配空格。

例如: \ b匹配其中任何一个:“!?,。@#$%^& *()_ +”。

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

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

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

^ ---只会匹配'moo'中的'o'。