Java 使用正则表达式匹配器获取组
Java get group with Regex matcher
我想将 replaceEntry (@length) 替换为 newEntry,但有些 replaceEntry 包含我不想替换的其他内容(例如 @length.article)。如果我只是查找模式而不对其进行分组,它会替换 replaceEntry 和以下字符,但我只想替换条目。是正则表达式错误还是其他原因?
private String replace(String code){
String code = "@length Lorem ipsum dolor sit amet, consetetur sadipscing elitr, @length.article sed diam
nonumy eirmod tempor invidunt ut labore et dolore magna @length.media aliquyam erat, sed
diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem @length_name
ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et
justo duo dolores et @length ea rebum. Stet clita kasd gubergren, no sea takimata sanctus
est Lorem ipsum dolor sit amet. @length";
String replaceEntry = "@length";
String newEntry = "@column";
Pattern pattern = Pattern.compile("(" + replaceEntry + ")([^\w-\.])");
Matcher matcher = pattern.matcher(code);
String newCode = code.replaceAll(matcher.group(1), newEntry);
return newCode;
}
您应该使用前瞻来捕获没有下一个字符的组但是仍然能够读取它们。例子
@length(?!\.)
这匹配@length,然后确保一个点不能被读取(但不读取点)
@length and @length are @length.details
匹配:索引 0 [@length]、索引 12 [@length]
您可以通过将 ([^\w-\.])
捕获组替换为 "(?![\w.-])"
negative lookahead 模式来修复您的模式,非消耗 模式读取,检查字符串但不将匹配的子串添加到匹配值中。
您可能会使用
Pattern.compile(replaceEntry + "(?![\w.-])")
参见regex demo。
或者,如果 replaceEntry
列表可能包含带有 special regex metacharacters 的项目,请使用 Pattern.quote()
将它们转义并被视为文字字符:
Pattern.compile(Pattern.quote(replaceEntry) + "(?![\w.-])")
如果 replaceEntry 总是以空格或字符串结尾结束,您可以简单地依赖于空格边界:
Pattern.compile(Pattern.quote(replaceEntry) + "(?!\S)")
参见regex demo。
(?!\S)
否定先行要求紧靠当前位置右侧的空格或字符串结尾。
替换的时候别忘了用Group 0,整场比赛:
String newCode = code.replaceAll(matcher.group(), newEntry);
^^
如果没有额外的代码行,可以减少三行
Pattern pattern = Pattern.compile("(" + replaceEntry + ")([^\w-\.])");
Matcher matcher = pattern.matcher(code);
String newCode = code.replaceAll(matcher.group(1), newEntry);
到
String newCode = code.replaceAll(Pattern.quote(replaceEntry) + "(?![\w.-])", newEntry);
我想将 replaceEntry (@length) 替换为 newEntry,但有些 replaceEntry 包含我不想替换的其他内容(例如 @length.article)。如果我只是查找模式而不对其进行分组,它会替换 replaceEntry 和以下字符,但我只想替换条目。是正则表达式错误还是其他原因?
private String replace(String code){
String code = "@length Lorem ipsum dolor sit amet, consetetur sadipscing elitr, @length.article sed diam
nonumy eirmod tempor invidunt ut labore et dolore magna @length.media aliquyam erat, sed
diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem @length_name
ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et
justo duo dolores et @length ea rebum. Stet clita kasd gubergren, no sea takimata sanctus
est Lorem ipsum dolor sit amet. @length";
String replaceEntry = "@length";
String newEntry = "@column";
Pattern pattern = Pattern.compile("(" + replaceEntry + ")([^\w-\.])");
Matcher matcher = pattern.matcher(code);
String newCode = code.replaceAll(matcher.group(1), newEntry);
return newCode;
}
您应该使用前瞻来捕获没有下一个字符的组但是仍然能够读取它们。例子
@length(?!\.)
这匹配@length,然后确保一个点不能被读取(但不读取点)
@length and @length are @length.details
匹配:索引 0 [@length]、索引 12 [@length]
您可以通过将 ([^\w-\.])
捕获组替换为 "(?![\w.-])"
negative lookahead 模式来修复您的模式,非消耗 模式读取,检查字符串但不将匹配的子串添加到匹配值中。
您可能会使用
Pattern.compile(replaceEntry + "(?![\w.-])")
参见regex demo。
或者,如果 replaceEntry
列表可能包含带有 special regex metacharacters 的项目,请使用 Pattern.quote()
将它们转义并被视为文字字符:
Pattern.compile(Pattern.quote(replaceEntry) + "(?![\w.-])")
如果 replaceEntry 总是以空格或字符串结尾结束,您可以简单地依赖于空格边界:
Pattern.compile(Pattern.quote(replaceEntry) + "(?!\S)")
参见regex demo。
(?!\S)
否定先行要求紧靠当前位置右侧的空格或字符串结尾。
替换的时候别忘了用Group 0,整场比赛:
String newCode = code.replaceAll(matcher.group(), newEntry);
^^
如果没有额外的代码行,可以减少三行
Pattern pattern = Pattern.compile("(" + replaceEntry + ")([^\w-\.])");
Matcher matcher = pattern.matcher(code);
String newCode = code.replaceAll(matcher.group(1), newEntry);
到
String newCode = code.replaceAll(Pattern.quote(replaceEntry) + "(?![\w.-])", newEntry);