正则表达式中方括号里是否需要使用点号

3

.*[.]*之间的确切区别是什么?

我尝试将它们放在括号中进行反向引用,并发现结果并不相同,虽然我不明白为什么会这样。

.应该匹配任何单个字符。

所以我想,无论是否在方括号内,使用*(匹配零个或多个)运算符都不应该有影响。但事实并非如此。为什么呢?


2
将一个正则表达式插入到http://regex101.com中,可以解释正在发生的事情。 - Alex K.
2个回答

9
.*中,“.”是一个特殊字符,匹配除换行符以外的任何字符(如果指定了DOTALL修饰符,则会匹配所有字符)。在一个字符类([.])中,“.”失去了它的特殊含义,开始匹配一个字面上的句点。
这是所有正则表达式都普遍存在的行为。

那么,如何指定:任意数量的任何(.)或空格(\s)字符?例如,在多行正则表达式中,1([.\s]*)2 如何捕获 1 和 2 之间的组? - user14492
@user14492,你的正则表达式可以匹配在12之间的0个或多个点或空格。如果你想匹配在12之间的任何文本,你需要参考如何在正则表达式中跨多行匹配任何字符?,并使用(?s)1(.*)2 / (?s)1(.*?)2 或者 1([\w\W]*)2 / 1([\w\W]*?)2。在JavaScript中也可能有其他选项,例如1([^]*)2 / 1([^]*?)2 - Wiktor Stribiżew
谢谢,它并不总是与多行有关;那只是我举的一个例子。我还想知道以下任意数量的所有(.)和特定字符(\t)的正确形式是什么。因为当你把点(.)放在拾取组(方括号)中,例如[.\t]+,它的意思并不相同?因为目前我必须用[\t.]+ === [\ta-zA-Z0-9]替换方括号中的所有点。 - user14492
@user14492 匹配任何字符 + 特定字符 = 匹配任何字符。 - Wiktor Stribiżew
不包括空格字符,如“\n, \r, \t, \s”? - user14492
@user14492 \s 不是空格字符,它是一个空格字符模式,并且可以匹配所有的空格字符。不知道你的意思。如果需要帮助,请提供一个测试用例。 - Wiktor Stribiżew

2
  • . 可匹配除换行符以外的任何字符。
  • \. 仅匹配字面上的"."
  • [.] 相当于[\.]\.。这只是为了方便-因为在字符组的上下文中,您几乎肯定不希望它匹配"任何字符"。

奖励--如果您使用我的Ruby gem,您可以轻松尝试这样的东西:

/./.examples # => ["a", "b", "c", "d", "e"]
/\./.examples # => ["."]
/[.]/.examples # => ["."]

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