我正在尝试改进正则表达式。
我有这个字符串:
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+")", "");
正确的方法是什么?我的概念错在哪里?
答案 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\\$)
^^^^ ^ ^ ^^^^ ^