我想用newEntry替换replaceEntry(@length),但是有一些replaceEntrys具有我不想被替换的其他内容(例如,@ 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;
}
最佳答案
您可以通过将([^\\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);