\b vs \\b in regex

3
根据正则表达式文档,\b匹配单词边界。我准备了一个字符串 "db bd how to" 和正则表达式 \b(a|b)(c|d)\b。我认为运行该正则表达式时应该匹配字符串中的 "bd",但实际上没有匹配到。但是如果将正则表达式写成 \\b(a|b)(c|d)\\b,则可以匹配。请问有何区别?

2
你使用哪种编程语言,Objective-C吗? - kennytm
这真的取决于上下文。如果你将表达式放在字符串中,在大多数编程语言中,\ 是字符串中的转义字符,所以你需要用 \\ 来创建一个字面上的反斜杠来表示该表达式。否则,根据不同的编程语言,该表达式可能会变成 b(a|b)(c|d)b - Felix Kling
@KennyTM:是的,我使用Objective-C。 - vietstone
2个回答

6

这里涉及到几个层面的转义

正则表达式 -----------------> | 正则表达式字面量 -> | 字符串字面量
-------------------------+------------------+---------------
单词边界                  | \b               | \\b
或运算 ("a" 或 "b")      | (a|b)            | (a|b)
或运算 ("c" 或 "d")      | (c|d)            | (c|d)
单词边界                  | \b               | \\b

1

如果这是在C或C++程序中,编译器本身可能会在编译期间解释'\b'并进行替换,因此您需要先从编译器中转义它。

所以如果您有

char *regex = "\\bword";

在您的源文件中,并将其传递给正则表达式函数,它将接收到 '\bword'。

编辑

我不知道它是否适用于Objective-C,我没有相关经验。


谢谢,你的答案是正确的。但是我选择Tomalak来进行更详细的解释。 - vietstone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接