0

我正在编写一个正则表达式来匹配一个数字序列,然后是一个点,然后是另一个数字序列,总长度,包括点,整个序列应该是 13。为此,我写的正则表达式曾是:(\d{6,12})\.(\d{0,6})(?<=.{13})

当我对以下两个数据样本运行此表达式时,我希望只有第二个匹配,但相反,两者都是数学运算。谁能帮我理解为什么?

  • 1234567.123456> 匹配,但我希望它不匹配;
  • 1234567.12345> 匹配。

这是我用来测试的 Java 代码: import java.util.regex.Pattern;

public class App {
    public static void main(String[] args) {
        Pattern matcher = Pattern.compile("(\\d{6,12})\\.(\\d{0,6})(?<=.{13})");
        System.out.println(matcher.matcher("1234567.123456").matches());
        System.out.println(matcher.matcher("1234567.12345").matches());
    }
}

输出:

true
true
4

3 回答 3

2

您需要将后向断言锚定到字符串的开头,否则它将匹配子字符串:

Pattern matcher = Pattern.compile("(\\d{6,12})\\.(\\d{0,6})(?<=^.{13})");

或者使用前瞻断言(更容易理解,IMO):

Pattern matcher = Pattern.compile("(?=.{13}$)(\\d{6,12})\\.(\\d{0,6})");
于 2013-04-05T08:49:20.963 回答
2

您需要使用锚来匹配字符串的开头:

"(\\d{6,12})\\.(\\d{0,6})(?<=^.{13})"
于 2013-04-05T08:50:31.370 回答
1

您可能希望在^后向表达式中添加一个锚 ( ):

(?<=^.{13})
于 2013-04-05T08:50:33.040 回答