3

我在使用 java.util.regex 的模式匹配器让一些正则表达式工作时遇到问题。我有以下表达式:

(?=^.{1,6}$)(?=^\d{1,5}(,\d{1,3})?$)

我针对以下字符串测试匹配项:

12345  (match OK)
123456 (no match)
123,12 (match OK)

当我在以下站点上对其进行测试时,它似乎运行良好:

http://rubular.com,好的

http://www.regextester.com/,好的

http://myregextester.com/index.php,好的

但是我似乎无法让它与我的 java 程序中的任何内容相匹配。此外,在线 java 正则表达式测试器给出相同的结果(不匹配):

http://www.regexplanet.com/advanced/java/index.html 没有匹配项???

我不知道为什么我不能让它在 java 中工作,但似乎在很多其他正则表达式引擎中工作?

编辑:这是非工作代码。原谅错字,我不能从我的代码 PC 复制/粘贴到 stackoverflow。

String inputStr = "12345";
String pattern = "(?=^.{1,6}$)(?=^\\d{1,5}(,\\d{1,3})?$)";
Pattern regexp = Pattern.compile(pattern);
System.out.println("Matches? "+regexp.matcher(inputStr).matches());
System.out.println(inputStr.matches(pattern));
4

3 回答 3

2

首先,您需要转义\模式中的 s 。然后,如果您使用matches(),Java 会尝试匹配整个字符串,因此它将返回 false ,除非您删除第二个前瞻或.*在末尾添加 a 。

这会在 Java 中产生正确的输出:

    String regex = "(?=^.{1,6}$)^\\d{1,5}(,\\d{1,3})?$";
    System.out.println("12345".matches(regex)); 
    System.out.println("123456".matches(regex)); 
    System.out.println("123,12".matches(regex));

这个表达式也是如此:

    String regex = "(?=^.{1,6}$)(?=^\\d{1,5}(,\\d{1,3})?$).*";
于 2012-07-19T09:19:04.813 回答
2

它工作正常。您可能正在使用该matches()方法,该方法期望正则表达式匹配并使用整个字符串。您的正则表达式不会消耗任何东西,因为它只是几个前瞻。在 RegexPlanet 网站上,查看该find()列,您将看到您期望的结果。在您的 Java 代码中,您必须创建一个 Matcher 对象,以便您可以使用它的find()方法。

于 2012-07-19T09:37:38.787 回答
1

工具之间的区别在于,在一种情况下它会尝试在另一种情况下找到匹配项,它会尝试匹配整个字符串。如果您在 java 中使用 string.matches(regex),这将为您的所有输入返回 false,因为您没有将整个字符串与您的前瞻表达式匹配。要么.*按照 Keppil 的建议附加 a,要么使用 Matcher 类:

Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(text);
if(matcher.find()) {
    System.out.println("Match found");
}
于 2012-07-19T09:26:38.060 回答