Java正则表达式混乱

时间:2013-03-27 06:22:09

标签: java regex

基本上我想将文件名与.json扩展名匹配,但不是以开头的文件匹配。并且不包括list.json。

这就是我提出的(没有java字符串转义)

(?i)^([^\.][^list].+|list.+)\.json$

我曾使用在线正则表达式测试程序Regexplanet来试用我的正则表达式 http://fiddle.re/x9g86

使用正则表达式测试程序时,一切正常,但是当我在Java中尝试它时。所有包含字母l,i,s,t的东西都将被排除在外......这对我来说非常困惑。

有人能给我一些线索吗?

非常感谢提前。

3 个答案:

答案 0 :(得分:8)

  

我想将文件名与.json扩展名匹配,但不是以.开头并排除list.json的文件。

我不确定你需要正则表达式。我发现以下内容更容易:

boolean match = s.endsWith(".json") && !s.startsWith(".") && !s.equals("list.json");

答案 1 :(得分:1)

您使用的字符排除类[^list]忽略了字符顺序,而不是排除list,排除li,{{s, 1}},或t

相反,您希望使用否定前瞻:

(?i)(?!^list\.json$)[^\.].*\.json

答案 2 :(得分:1)

否定前瞻会做到这一点。

(?i)(?!\.|list\.json$).*\.json

(?!\.|list\.json$)是否定前瞻检查,后面的字符不是list.json后跟字符串的结尾,或.

代码:

String regex = "(?i)(?!\\.|list\\.json$).*\\.json";
System.out.println("list.json".matches(regex)); // false
System.out.println(".json".matches(regex));     // false
System.out.println("a.Json".matches(regex));    // true
System.out.println("abc.json".matches(regex));  // true

但NPE更易读的解决方案可能更受欢迎。