为什么添加空格会使我的正则表达式错误?

时间:2016-09-29 15:03:36

标签: java regex

(^\s*\d+\)(.*) | ) | (^\s*Q\d+\.\s*(.*))

上述正则表达式与Q1. qeqwewqeqeq qerqer

不匹配

但如果我在|

之前和之后删除空白区域
(^\s*\d+\)(.*) | )|(^\s*Q\d+\.\s*(.*))

匹配我的字符串。

空白是什么意思?它等于\s吗?它会影响我的可读性。

3 个答案:

答案 0 :(得分:3)

是的,空白会影响你的正则表达式。不,它不等同于\s

\s shorthand character class等同于字符类[ \t\r\n\f] - 即与任何空白字符匹配的字符类。因此,虽然\s中的格式空间包含,但它们与等效

正如评论中所说,文字空白在正则表达式中很重要。事实上,我认为它会导致您的第一个替代(子模式(^\s*\d+\)(.*) | ))出错。

如果我正在阅读该子图案的意图,那么它应该匹配表格的文本

2) some_text

但它会:

  1. 如果后跟空格
  2. ,则仅匹配此文本
  3. 还匹配单个文字空间
  4. 构造这个子模式的更好方法是(^\s*\d+\)(.*)),完全处理结束空间和交替。此外,为了提高可读性,我们可以这样做:

    (^\s*(?:Q\d+\.|\d+\))\s*(.*))
    

    其中只替换问题编号格式,而不是整个模式。

    Demo on Regex101

答案 1 :(得分:2)

正则表达式的内容100%适用于确定输入是否匹配。你的想象力不会改变正则表达式处理。

正则表达式" \ dignore这部分\ d"将不符合输入" 12"但是会匹配输入" 1ignore this part2"。无论想象多少,都忽略了这部分"将被跳过,它仍然是正则表达式的一部分。

在您的情况下,额外的空格是您的形式"忽略此部分"。

答案 2 :(得分:1)

在正则表达式模式中,空格是与空格匹配的有意义的原子。如果您需要使用空格和制表符和换行符来格式化您的模式 - 使用空格而不会被正则表达式引擎考虑 - 您可以使用(?x)修饰符或{{3国旗。

然后,要使用(?x)选项匹配此类模式中的文字空间,您需要转义空格以匹配文字空格。或者,您可以考虑将任何空格与\s匹配:

\s  A whitespace character: [ \t\n\x0B\f\r]

请注意,如果您添加(?U)修饰符,Pattern.COMMENTS标记,\s将匹配所有Unicode空白(例如[\p{Zs}\t\r\n])。