2012-07-19 72 views
3

我在使用java.util.regex的模式匹配器获取一些正则表达式来工作时遇到了问题。我有以下表现:正则表达式在rubular中匹配,而不是在java中

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

我测试对下列字符串匹配:

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

当我测试它在以下网站似乎很好地工作:

http://rubular.com,OK

http://www.regextester.com/,ok

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)); 
+2

你在Java中使用什么方法进行匹配? – Joey 2012-07-19 09:12:09

+0

请用Java显示你的(非工作)代码。 – nhahtdh 2012-07-19 09:14:54

+0

你能告诉我们你想要匹配什么,并提供你正在使用这个正则表达式的Java代码吗? – Lopina 2012-07-19 09:17:55

回答

2

首先,您需要跳过\ 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)); 

所以做这个表达式:

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

工具之间的差异,在一个情况下,它会尝试找到一个匹配另一个它试图匹配整个字符串。如果在java中使用string.matches(regex),那么对于所有输入,这将返回false,因为您不会将整个字符串与您的先行表达式匹配。要么你追加一个.*作为Keppil建议,或者您使用的匹配器类:

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

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

+0

感谢所有人,问题似乎如上所述,不同的人用不同的文字说明了什么都没有消耗。在正则表达式字符串的末尾添加。*可修复所有内容。 为了完整起见,我在代码中添加了几行代码。猜猜我需要多读一点,并更新我对这部分正则表达式的知识! – Martijn 2012-07-19 10:24:14