有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

上面的正则表达式不匹配Q1. qeqwewqeqeq qerqer

但是如果我在^{之前和之后删除空白

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

它和我的线匹配

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


共 (3) 个答案

  1. # 1 楼答案

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

    \sshorthand character class相当于字符类[ \t\r\n\f],即匹配任何空白字符的字符类。因此,虽然格式化空间包含在\s,但它们并不是等价的

    正如评论中所说,文本空白在正则表达式中很重要。事实上,我相信这会在你的第一个候补模式(子模式(^\s*\d+\)(.*) | ))中导致一个错误

    如果我读对了子模式的意图,它应该匹配表单的文本

    2) some_text
    

    但它会:

    1. 仅当后跟空格时才匹配此文本
    2. 也可以匹配单个文本空间

    构建这个子模式的更好方法是(^\s*\d+\)(.*)),将结束空间和交替处理在一起。此外,为了提高可读性,我们可以这样做:

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

    它只在问题编号格式上交替,而不是整个模式

    Demo on Regex101

  2. # 2 楼答案

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

    然后,要用(?x)选项匹配这种模式中的文本空间,需要转义空间来匹配文本空间。或者,您可以考虑将所有空白与^ {< CD4>}:

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

    请注意,如果添加(?U)修饰符,^{}标志,\s将匹配所有Unicode空格(如[\p{Zs}\t\r\n]

  3. # 3 楼答案

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

    正则表达式“\dignore this part\d”与输入“12”不匹配,但与输入“1忽略此part2”匹配。不管在imagine中“忽略此部分”会被跳过多少,它仍然是正则表达式的一部分

    在你的情况下,额外的空间是你“忽略这部分”的形式