Python和Java中相同正则表达式的不同行为

bhu*_*hni 4 python java regex

首先,我道歉,因为我不太了解正则表达式.

我使用正则表达式来匹配字符串.我在Python命令行界面中测试了它,但是当我在Java中运行它时,它产生了不同的结果.

Python执行:

re.search("[0-9]*[\\.[0-9]+]?[^0-9]*D\\([M|W]\\)\\s*US", "9.5 D(M) US");
Run Code Online (Sandbox Code Playgroud)

结果如下:

<_sre.SRE_Match object; span=(0, 11), match='9.5 D(M) US'>
Run Code Online (Sandbox Code Playgroud)

但是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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

给出输出为:

5 D(M)美国

我不明白为什么它的行为方式不同.

Wik*_*żew 5

以下是在Java和Python中使用相同的模式:

"[0-9]*(?:\\.[0-9]+)?[^0-9]*D\\([MW]\\)\\s*US"
Run Code Online (Sandbox Code Playgroud)

请参阅PythonJava演示.

在Python中,[\\.[0-9]+]?读作2个子模式:( [\.[0-9]+1个或多个.s,[s或数字)和]?(0或1 ]).在这里看看你的正则表达式如何在Python中运行.或者,与捕获组的更多分离,这里.

在Java中,它读作一个单字符类(即[]内侧忽略整个子模式静置0或1,因为它们不能被正确地由正则表达式引擎解析,从而.,数字,或+),并且由于它是可选的,它没有任何捕捉(你可以得到的视觉暗示视觉正则表达式测试仪,型号123.+[]为输入,[\.[0-9]+]?为正则表达式).

而点睛之笔:[M|W]代表M,|或者W,当我想你的意思[MW]= MW.