正規表現メソッド、メソッドString.replaceAllおよびArrayListのみを使用して、文字列をトークンに分割し、引用符内に存在する区切り文字を無視するにはどうすればよいですか?区切り文字は、英数字または引用符で囲まれたテキストではない任意の文字です。
例:文字列:
hello ^ world'this * has two tokens'
出力する必要があります:
- こんにちは
- worldthis*には2つのトークンがあります
私はすでに存在する非常に良い受け入れられた答えがあることを知っていますが、私は別の正規表現ベースの(そして私はもっと簡単に言うかもしれません)アプローチを追加して、英数字以外の区切り文字を使用して与えられたテキストを分割します
正規表現:
/(?=(([^']+'){2})*[^']*$)[^a-zA-Z\\d]+/
これは基本的に、偶数の単一引用符が続く場合は英数字以外のテキストと一致することを意味します。つまり、一重引用符の外側にある場合は英数字以外のテキストと一致します。
コード:
String string = "hello^world'this*has two tokens'#2ndToken";
System.out.println(Arrays.toString(
string.split("(?=(([^']+'){2})*[^']*$)[^a-zA-Z\\d]+"))
);
出力:
[hello, world'this*has two tokens', 2ndToken]
デモ:
合理的な方法で行うことはできません。正規表現が苦手な問題を提起しています。
分割するパーツではなく、保持するパーツを識別するためにを使用しMatcher
ます。
String s = "hello^world'this*has two tokens'";
Pattern pattern = Pattern.compile("([a-zA-Z0-9]+|'[^']*')+");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
オンラインで動作することを確認してください:ideone
これには正規表現を使用しないでください。動作しません。代わりにパーサーを使用/書き込みます。
適切なタスクには適切なツールを使用する必要があります。