2

我是 Java 正则表达式的新手。如果您发现这个问题真的很简单,我深表歉意。但是我已经看到了一些类似的问题并尝试了这些答案,但都没有奏效。

我正在尝试匹配具有模式“括号外的单词(单词)”的字符串,括号内的内容可能有多种选择,但我想排除其中一些。换句话说,应该匹配括号内不包含某些单词的字符串。

例如,如果我不希望 A 或 B 在括号内,

 words outside parenthesis ( C )  // should match
 words outside parenthesis ( A )  // should not match
 words outside parenthesis ( B )  // should not match

其中 A 和 B 可以是单词或短语。但它们不会一起出现(模式“AB”不可能出现在括号内)。

我试过了:

    .+\(\s*(?!A|B)\s*\)

    .+\(\s*^/(?!A|B)\s*\)

    .+\(\s*(?!\bA\b)(?!\bB\b)\s*\)

然而,他们都没有工作。请帮忙!谢谢!

编辑

也许我没有澄清自己。A 或 B 可以是单词或短语,这意味着 A 可能是单词 'hello',B 可能是 'hello world',我不想匹配 'hello' 或 'hello world'。所以 [^AB] 不适用于我的情况,因为那会变成 [^hellohello world]。

4

3 回答 3

2

您的正则表达式的问题是,在进行否定前瞻之后,您在以 a或like(?![^AB])结束之前的单词不匹配)\w+[^)]+

.+\(\s(?!(nomatch|false)\b)\w+\s\)

样本匹配:

words outside parenthesis ( match )  // matches
words outside parenthesis ( true )  // matches

words outside parenthesis ( nomatch )  // doesn't match
words outside parenthesis ( false )  // doesn't match
于 2013-10-14T15:14:23.853 回答
1

您可以将此正则表达式模式与Matcher#find()方法一起使用:

\\([^)]*(?:A|B)[^)]*\\)

如果该find()方法true甚至为此模式返回一次,那么您的字符串不是有效匹配。

诀窍是找到不应该匹配的模式。如果找到模式,那么您的字符串无效。这更容易实现。

String[] arr = { "words outside parenthesis ( A )", 
                 "words outside parenthesis ( B )",
                 "words outside parenthesis ( C )" 
               };

Pattern pattern = Pattern.compile("\\([^)]*(?:A|B)[^)]*\\)");

for (String str: arr) {
    Matcher matcher = pattern.matcher(str);

    if (matcher.find()) {
        System.out.println(str + " => is not a valid match");
    } else {
        System.out.println(str + " => is a valid match");
    }
}

用您需要的单词替换A和。B如果有更多单词,则将它们附加到交替运算符。

于 2013-10-14T15:13:01.417 回答
0

用这个 : String myPattern = "^.*\\([^AaBb]\\)$";

^.*= 可以以任何字符开头,甚至可以不以字符开头。

\\([^AaBb])\\$= 不以 (A)、(a)、(B) 或 (b) 结尾。

于 2013-10-14T15:11:20.313 回答