基本上我想将文件名与.json扩展名匹配,但不是以开头的文件匹配。并且不包括list.json。
这就是我提出的(没有java字符串转义)
(?i)^([^\.][^list].+|list.+)\.json$
我曾使用在线正则表达式测试程序Regexplanet来试用我的正则表达式 http://fiddle.re/x9g86
使用正则表达式测试程序时,一切正常,但是当我在Java中尝试它时。所有包含字母l,i,s,t的东西都将被排除在外......这对我来说非常困惑。
有人能给我一些线索吗?
非常感谢提前。
答案 0 :(得分:8)
我想将文件名与
.json
扩展名匹配,但不是以.
开头并排除list.json
的文件。
我不确定你需要正则表达式。我发现以下内容更容易:
boolean match = s.endsWith(".json") && !s.startsWith(".") && !s.equals("list.json");
答案 1 :(得分:1)
您使用的字符排除类[^list]
忽略了字符顺序,而不是排除list
,排除l
,i
,{{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更易读的解决方案可能更受欢迎。