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

Posted

技术标签:

【中文标题】正则表达式中\\b和\\s的区别【英文标题】:Difference between \b and \s in Regular Expression正则表达式中\b和\s的区别 【发布时间】:2013-06-05 21:25:50 【问题描述】:

我在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)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..

在这两个方面需要一些指导。

【问题讨论】:

正则表达式中的断言类似于传统编程中的“IF”。 foo\b 匹配 "foo" 如果它后跟一个非单词字符。 @thg435 首先感谢.. 有一个问题要问。什么是正则表达式中的断言?你有什么例子吗? \b 在您的问题中是一个断言。其他示例是诸如^$ 和lookarounds 之类的锚点。 【参考方案1】:

\b边界字符

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

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

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

\s空格

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


编辑

因为\b 单独使用没有多大意义,所以我向e\b 展示了如何使用它(上图)。 OP 询问(在评论中)e\se\b 相比会匹配什么,以更好地解释\b\s 之间的区别。

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

【讨论】:

@lakesh e\s 将是 2 个字符匹配。 e\b 将只匹配一个字符。这两者之间的比较可能会比e\b\s 更好地解释它。【参考方案2】:

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

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

\s 是一个匹配任何空白字符的predefined character class。

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

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

【讨论】:

首先感谢您的回复。你用什么/\bFoo?为什么你需要一个额外的/?可以给我解释一下吗? 对不起,这是 Perl 语法,只是一个正则表达式分隔符,但我只在一个表达式上使用它。已移除【参考方案3】:

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

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

0+\d*

但是你看,这也匹配1007101000101101!那么,你可以试试:

\s0+\d*

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

\b0+\d*

【讨论】:

【参考方案4】:

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

\s 仅匹配空格。

例如: \b 将匹配以下任何一个:"!?,.@#$%^&*()_+ "。

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

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

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

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

【讨论】:

以上是关于正则表达式中\b和\s的区别的主要内容,如果未能解决你的问题,请参考以下文章

[\s\S]* 有啥区别?和 。*?在 Java 正则表达式中?

在正则表达式中使用 '\s' 和实际空格之间的区别? [复制]

正则表达式() [] {}区别

golang 正则 regexp包使用

正则表达式(括号)[中括号]{大括号}的区别

正则表达式(括号)[中括号]{大括号}的区别小结