java为什么添加空格会使我的正则表达式出错?
(^\s*\d+\)(.*) | ) | (^\s*Q\d+\.\s*(.*))
上面的正则表达式不匹配Q1. qeqwewqeqeq qerqer
但是如果我在^{
(^\s*\d+\)(.*) | )|(^\s*Q\d+\.\s*(.*))
它和我的线匹配
空白是什么意思?它等于\s
?这影响了我的可读性
你可以在下面搜索框中键入要查询的问题!
(^\s*\d+\)(.*) | ) | (^\s*Q\d+\.\s*(.*))
上面的正则表达式不匹配Q1. qeqwewqeqeq qerqer
但是如果我在^{
(^\s*\d+\)(.*) | )|(^\s*Q\d+\.\s*(.*))
它和我的线匹配
空白是什么意思?它等于\s
?这影响了我的可读性
# 1 楼答案
是的,空格会影响你的正则表达式。不,它不等同于
\s
\s
shorthand character class相当于字符类[ \t\r\n\f]
,即匹配任何空白字符的字符类。因此,虽然格式化空间包含在\s
中,但它们并不是等价的正如评论中所说,文本空白在正则表达式中很重要。事实上,我相信这会在你的第一个候补模式(子模式
(^\s*\d+\)(.*) | )
)中导致一个错误如果我读对了子模式的意图,它应该匹配表单的文本
但它会:
构建这个子模式的更好方法是
(^\s*\d+\)(.*))
,将结束空间和交替处理在一起。此外,为了提高可读性,我们可以这样做:它只在问题编号格式上交替,而不是整个模式
Demo on Regex101
# 2 楼答案
在正则表达式模式中,空间是与空间匹配的有意义的原子。如果您需要使用空格、制表符和换行符来格式化您的模式——使用正则表达式引擎不会考虑的空格——您可以使用} 标志
(?x)
修饰符或^{然后,要用
匹配。(?x)
选项匹配这种模式中的文本空间,需要转义空间来匹配文本空间。或者,您可以考虑将所有空白与^ {< CD4>}:请注意,如果添加} 标志,
(?U)
修饰符,^{\s
将匹配所有Unicode空格(如[\p{Zs}\t\r\n]
)# 3 楼答案
正则表达式的内容100%适用于确定输入是否匹配。你的想象力不会改变正则表达式的处理
正则表达式“\dignore this part\d”与输入“12”不匹配,但与输入“1忽略此part2”匹配。不管在imagine中“忽略此部分”会被跳过多少,它仍然是正则表达式的一部分
在你的情况下,额外的空间是你“忽略这部分”的形式