首先,我很抱歉,因为我不太了解正则表达式。
我正在使用正则表达式来匹配字符串。我在 Python 命令行界面中测试了它,但是当我在 Java 中运行它时,它产生了不同的结果。
Python执行:
re.search("[0-9]*[\\.[0-9]+]?[^0-9]*D\\([M|W]\\)\\s*US", "9.5 D(M) US");
结果如下:
<_sre.SRE_Match object; span=(0, 11), match='9.5 D(M) US'>
但是Java代码
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class RegexTest {
private static final Pattern FALLBACK_MEN_SIZE_PATTERN = Pattern.compile("[0-9]*[\\.[0-9]+]?[^0-9]*D\\([M|W]\\)\\s*US");
public static void main(String[] args) {
String strTest = "9.5 D(M) US";
Matcher matcher = FALLBACK_MEN_SIZE_PATTERN.matcher(strTest);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
}
}
给出输出为:
5 D(M) 美国
我不明白为什么它的行为方式不同。
最佳答案
以下是在 Java 和 Python 中工作相同的模式:
"[0-9]*(?:\\.[0-9]+)?[^0-9]*D\\([MW]\\)\\s*US"
请参阅 Python 和 Java 演示。
在 Python 中,
[\\.[0-9]+]?
被读取为 2 个子模式:[\.[0-9]+
(1 个或多个 .
、[
或数字)和 ]?
(0 或 1 个 ]
)。看看如何 your regex works in Python here 。或者,通过捕获组的更多细节化, here 。在 Java 中,它被读取为一个单一的字符类(即
[
和 ]
内部是 忽略 因为它们不能被正则表达式引擎正确解析,因此整个子模式代表 0 或 1 .
、一个数字或 +
)和由于它是可选的,因此它没有捕获任何内容(您可以在 Visual Regex Tester 处获得视觉提示,输入 123.+[]
作为输入,输入 [\.[0-9]+]?
作为正则表达式)。最后一点:
[M|W]
代表 M
、 |
或 W
,而我认为你的意思是 [MW]
= M
或 W
。关于java - Python 和 Java 中相同正则表达式的不同行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30527195/