正则表达式中\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\s
与e\b
相比会匹配什么,以更好地解释\b
和\s
之间的区别。
在同一个字符串中,e\s
只有一个匹配项,而e\b
有两个匹配项,因为逗号不是空格。请注意,e\s
匹配(图 3)包括空白,而 e\b
匹配不包括(图 1)。
【讨论】:
@lakeshe\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
确实匹配一个字符。这是捕获和更复杂的正则表达式的一个重要区别。
例如,假设您尝试匹配以多个零开头的数字,例如007
或000101101
。你可以试试:
0+\d*
但是你看,这也匹配1007
和101000101101
!那么,你可以试试:
\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 正则表达式中?