2

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

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

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

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

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

谁能给我一些线索?

提前谢谢了。

4

3 回答 3

8

我想将文件名与.json扩展名匹配,但不.匹配以list.json.

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

boolean match = s.endsWith(".json") && !s.startsWith(".") && !s.equals("list.json");
于 2013-03-27T06:27:07.280 回答
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 更易读的解决方案可能是首选。

于 2013-03-27T07:09:17.233 回答
1

您正在使用字符排除类 ,[^list]它忽略字符顺序,而不是 exclude ,排除, ,或list的任何情况。list

相反,您想使用负前瞻:

(?i)(?!^list\.json$)[^\.].*\.json
于 2013-03-27T06:28:22.327 回答