ReplaceAll 当它不是字母字符时

ReplaceAll when it is not alpha characters

我需要替换字符串中所有出现在非字母字符(数字、空格等)之间或字符串开头或结尾的单词,以获得 $0。但是,当我使用 replaceAll 时,我的正则表达式模式似乎不起作用。

我尝试了在网上找到的几种解决方案,例如 Pattern.quote,但该模式似乎不起作用。但是,它在 https://regexr.com/

上完美运行
public static final String REPLACE_PATTERN = "(?<=^|[^A-Za-z])(%s)(?=[^A-Za-z]|$)";

String patternToReplace = String.format(REPLACE_PATTERN, "a");

inputString = inputString.replaceAll(Pattern.quote(patternToReplace), "[=10=]");

例如,字符串和单词 "a":

a car4is a5car

我希望输出为:

[=12=] car4is car

Pattern.quote() returns 正则表达式文字和一切 in-between 是 treated like a text.

您应该使用 Matcher 来替换所有出现的字符串。除此之外,正如 @Donat 所指出的,[=13=] 被视为正则表达式变量,因此您需要对其进行转义。

inputString = Pattern.compile(patternToReplace).matcher(inputString).replaceAll("\[=10=]");

当你想用"[=10=]"替换字符串的匹配部分时,你必须写
"\[=11=]"。这是因为 [=12=] 有特殊的含义:匹配字符串。所以你自己替换字符串。

你引用错了。你不应该引用模式。您应该引用 "a" - 模式中应该按字面意思 .

处理的部分
String patternToReplace = String.format(REPLACE_PATTERN, Pattern.quote("a"));

如果你永远不会在 format 的第二个参数中放置任何其他字母,那么你根本不需要 quote,因为字母在正则表达式中没有特殊含义.

另外,$作为替换有特殊含义,需要转义:

inputString = inputString.replaceAll(patternToReplace, "\[=11=]");

只需从 inputString.replaceAll(Pattern.quote(patternToReplace), "[=12=]"); 更改为 inputString.replaceAll(patternToReplace, "\[=13=]");

我已经用这段代码测试过:

public static final String REPLACE_PATTERN = "(?<=^|[^A-Za-z])(%s)(?=[^A-Za-z]|$)";
String patternToReplace = String.format(REPLACE_PATTERN, "a");
inputString = inputString.replaceAll(patternToReplace, "\[=10=]");
System.out.println(inputString);

输出:

[=11=] car4is car

希望对您有所帮助:)