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

我有这个字符串:

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+")", "");


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

最佳答案

你到那儿了!但是大多数将使用捕获组。

\\$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\\$)
^^^^             ^  ^     ^^^^             ^

07-24 09:37