14

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

这两个需要一些指导。

4

4 回答 4

23

\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因为逗号不是空格。请注意,匹配项(图 3)包括匹配项不e\s包含的空白(图 1)。e\b

在此处输入图像描述

于 2013-06-10T09:06:56.987 回答
3
  • \b正在匹配单词边界。这是一个零宽度断言,意味着它不匹配一个字符,它匹配一个位置,其中某个条件为真。

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

  • \s是匹配任何空白字符的预定义字符类

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

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

于 2013-06-10T09:06:51.523 回答
2

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

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

0+\d*

但是请看,这也将匹配1007and 101000101101!那么,您可以尝试:

\s0+\d*

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

\b0+\d*
于 2013-06-10T09:05:19.963 回答
0

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

\s只匹配空白。

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

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

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

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

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

于 2015-10-21T19:36:16.373 回答