2

我正在尝试匹配一个字符,例如 ' 如果它前面没有字符 \。

有效的État de l\'impression

无效的État de l'impression

有效的Saisir l\'utilisateur et le domaine pour la connexion

我相信我所追求的是某种断言,例如消极的回顾?

例如(?<!\\)',当我在RegexBuilder中进行测试时效果很好

但是问题是当我试图在 Java 中进行这项工作时

代码

String[] inputs = new String[] { "Recherche d'imprimantes en cours…", "Recherche  d\\'imprimantes en cours…" } ;

for(String input : inputs)
{
    Pattern p = Pattern.compile("(?<!\\\\)'");
    System.out.println(input);
    System.out.println(p.matcher(input).matches());
}

输出

Recherche d'imprimantes en cours…
false
Recherche  d\'imprimantes en cours…
false

哪个应该匹配truefalse

4

3 回答 3

3

p.matcher(input).matches()验证整个输入。试试p.matcher(input).find()吧。

于 2012-04-26T11:21:36.547 回答
2

不要在循环中对同一模式使用 Pattern.compile() ——它违背了“编译”的目的。

String[] inputs = new String[] { 
    "Recherche d'imprimantes en cours…", 
    "Recherche  d\\'imprimantes en cours…" 
};
Pattern pat = Pattern.compile("(?<!\\\\)'");

for (String s : inputs) {
    Matcher mat = pat.matcher(s);
    while (mat.find()) {
        System.out.format("In \"%s\"\nFound: \"%s\" (%d, %d)\n",
            s, mat.group(), mat.start(), mat.end());
    }
}   

输出:

In "Recherche d'imprimantes en cours…"
Found: "'" (11, 12)
于 2012-04-26T11:55:12.437 回答
1

正则表达式应该可以正常工作,但Matcher#matches()不能像您认为的那样工作。它只返回与整个字符串匹配的表达式的 true。

从 JavaDoc 开始Matcher#matches()

尝试将整个区域与模式匹配。

于 2012-04-26T11:21:43.017 回答