正则表达式分组行为异常

时间:2018-03-08 14:55:12

标签: java regex regex-group

我需要识别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 :(得分:4)

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

因此与正则表达式不等同

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

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

如果你想重复正则表达式,你需要重新输入它。显式或隐式,如

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

请注意,对于[0|1],您可能需要[01][...]内的所有内容都已被解释为设置

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

这样的输入
|13.|13 // Matches

有多个网站可以测试正则表达式,并提供解释,例如 regex101 。这是您的例子regex101/r/f1ytVE