正则表达式分组行为异常

Regex Grouping behaves abnormally

我需要识别像 xxx.xxx 这样的数字 第一个数字是可选的,它可以是 01。第二个也是可选的,可以是09。第三个应该是 09.

所以我使用正则表达式 ([0|1]?[0-9]?[0-9])\.\1。但我看到了意外行为

这是我的代码,

package HelloWorld;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.regex.*;
public class Practice 
{
    public static void main(String arg[]) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String sample;
        for(int i=0;i<6;i++)
        {
            sample = br.readLine();
            if(Pattern.matches(MyRegex.pattern,sample))
            {
                System.out.println("true");
            }
            else
            {
                System.out.println("false");
            }
        }
    }
}
class MyRegex
{
    public static String pattern = "([0|1]?[0-9]?[0-9])\.\1";
}

对于输入,

000.12  => false
000.00  => false
000.000 => true
23.23   => trie

提前致谢。

\1 命令不重复 组内的正则表达式。它只会重复您之前捕获的文本。

所以它不等同于正则表达式

([0|1]?[0-9]?[0-9])\.([0|1]?[0-9]?[0-9])

这就是为什么它只允许像 23.23 这样的重复,因为第二部分等于第一部分。

如果您想要重复正则表达式,则需要重新键入。显式或隐式 like

String part = "([0|1]?[0-9]?[0-9])";
String pattern = part + "\." + part;

请注意,[0|1] 您的意思可能是 [01][...] 中的所有内容都已被解释为 set.

如果您使用 [0|1],您实际上匹配字符 01 字符 |。所以你的模式会匹配输入 likes

|13.|13 // Matches

有多个站点可以测试正则表达式,并附有解释,例如 regex101。这是您的示例 regex101/r/f1ytVE.