まず第一に、私はその質問が本当に好きです。さて、あなたが望むことは単一で行うことができませんでした。そのためには、可変長replaceAll
のが必要になるため、これは許可されていません。negative look-behind
それが許されていれば、それほど難しくはなかっただろう。
とにかく、ここではシングルreplaceAll
はオプションではないので、ここで少しハックすることができます。semi-colon
最初に最後の文字列をいくつかの文字シーケンスに置き換えるのと同じentity reference
ように、文字列の残りの部分などには必ず存在しませんXXX
。私はこれが正しくないことを知っています、しかしあなたは確かにそれを助けることができません。
だから、これがあなたが試すことができるものです:
String str = "a;b&c &";
str = str.replaceAll("(&\\w+);", "$1XXX")
.replaceAll("&(?!\\w+?XXX)|[^\\w&]", "")
.replaceAll("(&\\w+)XXX", "$1;");
System.out.println(str);
説明:
- 最初のreplaceAllは、のようなパターン
&
、&XXX
または最後に置き換えられた他のシーケンスを置き換え;
ます。
- 2番目のreplaceAllは、
&
その後にない文字\\w+XXX
、または任意のnon-word, non &
文字を置き換えます。これは、ある種のパターン&'s
の一部ではないすべてのものを置き換えます。&
さらに、他の単語以外の文字も置き換えます。
- 3番目のreplaceAllは、から再作成するために、に再置換
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