对负面看法的理解不足

时间:2012-07-10 18:34:34

标签: java regex

我正在尝试改进正则表达式。

我有这个字符串:

String myString = 
    "stuffIDontWant$KEYWORD$stuffIWant$stuffIWant$KEYWORD$stuffIDontWant";

我这样做只减去我想要的东西:

    String regex = "\\$KEYWORD\\$.+\\$.+\\$KEYWORD\\$";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(myString);

    if(m.find()){
        String result = stuff.substring(m.start(), m.end());
    }

目标是获取stuffIWant$stuffIWant,然后将其与字符$分开,因此,为了改进它并避免将Patter和Matcher导入我的java源代码,我读到了关于外观的内容,所以我的第二种方法是:

//Deletes what matches regex
    myString.replaceAll(regex, ""); 
// Does nothing, and i thought it was just the opposite of the above instruction.
    myString.replaceAll("(?! "+regex+")", ""); 

正确的方法是什么?我的概念错在哪里?

1 个答案:

答案 0 :(得分:3)

你到了那里!但大多数人会使用捕获组

\\$KEYWORD\\$(.+)\\$(.+)\\$KEYWORD\\$
             ^  ^   ^  ^

这些括号将存储它们所包含的内容,即捕获。第一组将被索引为1,第二组将被编入索引2.您可以使用上面的表达式来尝试这一点,看看发生了什么。

if (m.find()) {
    int count = m.groupCount();
    for (int i=0; i<count; i++) {
        System.out.println(m.group(i));
    }
} 

也可以通过外观解决,但不必要:

(?<=\\$KEYWORD\\$).+?\\$.+?(?=\\$KEYWORD\\$)
^^^^             ^  ^     ^^^^             ^