带有正则表达式匹配器的Java get组

来源:爱站网时间:2021-09-17编辑:网友分享
我想用newEntry替换replaceEntry(@length),但是有些replaceEntrys具有我不想被替换的其他内容(例如,@ length.article)。如果我只是寻找模式...

问题描述


我想用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;
}

思路一:


您应该使用前瞻性来捕获组而没有下一个字符但是仍然能够读取它们。范例

@length(?!\.)

此匹配@ length,然后确保之后不能读取点(但不读取点)

@length and @length are @length.details匹配:索引为0 [@length],索引为12 [@length]

思路二:


您可以通过将([^\\w-\\.])捕获组替换为"(?![\\w.-])" negative lookahead模式来修复您的模式,该模式是readsnon-using模式,它检查字符串但不添加匹配的子字符串到匹配值。

您可能会使用

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)否定前瞻需要在当前位置的右边紧跟空白或字符串结尾。

[替换时,请不要忘记使用组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);

to

String newCode = code.replaceAll(Pattern.quote(replaceEntry) + "(?![\\w.-])", newEntry);

上一篇:AWS SDK无法读取环境变量

下一篇:Android:以编程方式添加TextInputLayout

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载