Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么“^\s*$不匹配”&引用;使用多行?_Java_Regex - Fatal编程技术网

Java 为什么“^\s*$不匹配”&引用;使用多行?

Java 为什么“^\s*$不匹配”&引用;使用多行?,java,regex,Java,Regex,我支持这个Java应用程序,其中开发人员基于RegEx实现了一些过滤。为了尽可能通用,他们使用多行标志编译模式 前几天我注意到了一些意想不到的事情。 在Java中,模式“^\\s*$”与多行标志不匹配。没有那面旗子它是匹配的 Pattern pattern = Pattern.compile("^\\s*$", Pattern.MULTILINE); Matcher matcher = pattern.matcher(""); System.out.println("Multiline: "+

我支持这个Java应用程序,其中开发人员基于RegEx实现了一些过滤。为了尽可能通用,他们使用多行标志编译模式

前几天我注意到了一些意想不到的事情。 在Java中,模式
“^\\s*$”
与多行标志不匹配。没有那面旗子它是匹配的

Pattern pattern = Pattern.compile("^\\s*$", Pattern.MULTILINE);
Matcher matcher = pattern.matcher("");

System.out.println("Multiline: "+matcher.find());

pattern = Pattern.compile("^\\s*$");
matcher = pattern.matcher("");

System.out.println("No-multiline: "+matcher.find());
这将产生以下输出

Multiline: false
Non-Multiline: true
对于
匹配项()
,可以看到相同的结果:

我希望所有案例都匹配。
在Python中,就是这样。这:

import re

print(re.search(r'^\s*$', "", re.MULTILINE))
print(re.search(r'^\s*$', ""))
给出:

<_sre.SRE_Match object; span=(0, 0), match=''>
<_sre.SRE_Match object; span=(0, 0), match=''>

在Perl中,这两种情况也匹配,我想我记得PHP的情况是一样的


如果有人能解释Java处理这种情况的方式背后的原因,我将不胜感激。

您将一个空字符串传递给匹配器。使用
Pattern.MULTILINE
^
应该在字符串的开头匹配,但可能有点不同:

如果激活了
多行
模式,则
^
在输入开始和任何行结束符之后匹配,但在输入结束时除外

因为字符串是空的,所以输入的开始就是它的结束


注意:如果默认情况下传递标志,但事实上,您希望模式在字符串的开头匹配,则可以使用
\a
而不是
^
\z
作为字符串的结尾,而不是
$
,即使使用
模式也会匹配字符串的开始/结束。多行
(即使是空字符串也会通过
\\A\\s*\\z
测试)。

你说得对。这是因为我测试了matches()和find()之间是否存在差异。但在这两种情况下,这两种方法都可以重现。我更新了我的问题,使用find()在这两种情况下,我只想与大家分享一下
find()中存在的问题
。也可能提供一些见解。我理解文档的方式是,
^
总是在字符串开头匹配,如果在一行的开头之前有一个实际上是空的行结束符,并且在字符串的结尾,则例外情况适用。感谢您提供使用
\\a
\\z 相反。
<_sre.SRE_Match object; span=(0, 0), match=''>
<_sre.SRE_Match object; span=(0, 0), match=''>