Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式在rubular中匹配,而不是在java中匹配_Java_Regex - Fatal编程技术网

正则表达式在rubular中匹配,而不是在java中匹配

正则表达式在rubular中匹配,而不是在java中匹配,java,regex,Java,Regex,我在使用java.util.regex的模式匹配器获取一些正则表达式时遇到问题。我有以下的表达: (?=^.{1,6}$)(?=^\d{1,5}(,\d{1,3})?$) String regex = "(?=^.{1,6}$)(?=^\\d{1,5}(,\\d{1,3})?$).*"; 我根据以下字符串测试匹配: 12345 (match OK) 123456 (no match) 123,12 (match OK) 当我在以下网站上进行测试时,它似乎工作得很好: 嗯 嗯 嗯

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

(?=^.{1,6}$)(?=^\d{1,5}(,\d{1,3})?$)
    String regex = "(?=^.{1,6}$)(?=^\\d{1,5}(,\\d{1,3})?$).*";
我根据以下字符串测试匹配:

12345  (match OK)
123456 (no match)
123,12 (match OK)
当我在以下网站上进行测试时,它似乎工作得很好:

然而,我似乎无法使它与java程序中的任何内容匹配。另外,一个在线java正则表达式测试仪给出了相同的结果(没有匹配项):

没有火柴

我不知道为什么我不能在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));

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

这将生成正确的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));
这个表达式也是如此:

(?=^.{1,6}$)(?=^\d{1,5}(,\d{1,3})?$)
    String regex = "(?=^.{1,6}$)(?=^\\d{1,5}(,\\d{1,3})?$).*";

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

Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(text);
if(matcher.find()) {
    System.out.println("Match found");
}

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

在Java中使用什么方法进行匹配?请显示您的(非工作)用Java编写的代码。你能告诉我们你想匹配什么并提供你在其中使用这个正则表达式的Java代码吗?另一件事是正则表达式做零长度断言-这意味着如果两个断言都为真,整个正则表达式将匹配一个空字符串,但部分输入仍然被捕获在断言中的捕获组中。谢谢大家,问题似乎是如上所述,不同的人用不同的措辞表示什么都没有被消耗。在正则表达式字符串的末尾添加。*可以修复所有问题。为了完整起见,我在问题中添加了几行代码。我想我需要多读一点,更新我对正则表达式这部分的知识!