【问题标题】: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 之类的锚点。

标签: ios regex nsregularexpression


【解决方案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】:
  • \bword 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”。

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2012-02-22
      • 2023-04-07
      • 2021-10-01
      • 2016-03-12
      相关资源
      最近更新 更多