我想清除一个字符串中除了&之外的所有非单词字符,例如模式可能是&[\w]+;
例如:
abc; => abc
abc & => abc &
abc& => abc
如果我使用
string.replaceAll("\W","")
,它会从第二个示例中同时移除;
和'&'
,而我并不希望这样。在此问题中使用否定预查是否可以给出一个快速解决正则表达式模式的方法?我不确定你能够使用简单的String.replaceAll方法来实现这个功能。你应该使用Pattern和Matcher来循环匹配,相当于手动查找和替换。以下代码应该可以解决问题。
public String replaceString(String origString) {
Pattern pattern = Pattern.compile("&(\w+);|[^\w]");
Matcher matcher = pattern.matcher(origString);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
if (matcher.group().startsWith("&") && !matcher.group(1).equals("amp")) {
matcher.appendReplacement(sb, matcher.group());
} else {
matcher.appendReplacement(sb, "");
}
}
matcher.appendTail(sb);
return sb.toString();
}
String str = "a;b&c &";
str = str.replaceAll("(&\\w+);", "$1XXX")
.replaceAll("&(?!\\w+?XXX)|[^\\w&]", "")
.replaceAll("(&\\w+)XXX", "$1;");
System.out.println(str);
说明:
&
这样的模式替换为&XXX
,或者任何最后一个;
替换的序列。\\w+XXX
或任何非单词、非&
字符的&
。这将替换所有不属于&
类型模式的&
。此外,还会替换任何其他非单词字符。XXX
替换为;
,以从&XXX
创建回来&
为了更容易理解,您可以使用Pattern
和Matcher
类,每当替换标准复杂时,我都更喜欢使用它们。
String str = "a;b&c &";
Pattern pattern = Pattern.compile("&\\w+;|[^\\w]");
Matcher matcher = pattern.matcher(str);
StringBuilder sb = new StringBuilder();
while (matcher.find()) {
String match = matcher.group();
if (!match.matches("&\\w+;")) {
matcher.appendReplacement(sb, "");
} else {
matcher.appendReplacement(sb, match);
}
}
matcher.appendTail(sb);
System.out.println(sb.toString());
这个代码与@Eric的代码类似,但是是对其进行了概括。那个代码只能在&
上工作,当然,如果它被改进以消除其中抛出的NullPointerException
,那么它也可以运行。
string.replace(/&(?!\w+;)/ig, '');
这个代码用于替换所有不跟随以分号结尾的单词字符的 & 符号。
编辑(Java):
string.replaceAll("/&(?!\w+;)/i", '');
str.replaceAll("(?<!&\\w+);|&(?!\\w+-)|[^\\w;&]", "");
- Rohit Jain