私は正規表現を使用して、私の文字列を分割しようとしています。これは、すべての区切り文字の前後にも、長さゼロのマッチを含める必要があります。区切り文字がある場合たとえば、^
私の文字列とされ^^^
、私は4、長さゼロのグループを取得するために得ることを期待しています。私はちょうど使用することはできませんregex = "([^\\^]*)"
、それはすべての後に、余分な長さゼロのマッチが含まれますので、真の区切り文字の間で一致。ラインの開始後または区切り文字の後に次はない、区切り記号を使用することを決定した私はそう。それは上の完璧な作品https://regex101.com/ (ごめんなさい、私は私の例を共有するには、このウェブサイト上の共有オプションを見つけることができなかった)が、のIntelliJ IDEAの中でそれが1試合をスキップします。
だから、今、私のコードは次のとおりです。
final String regex = "(^|\\^)([^\\^]*)";
final String string = "^^^^";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find())
System.out.println("[" + matcher.start(2) + "-" + matcher.end(2) + "]: \"" + matcher.group(2) + "\"");
そして私は5空の文字列の一致を期待しています。しかし、私は唯一の4を持っています:
[0-0]: ""
[2-2]: ""
[3-3]: ""
[4-4]: ""
疑問は、なぜそれが一致するとどのように私はそれを修正することができます[1-1]をスキップしないのですか?
あなたの正規表現の一致文字列の先頭またはいずれか^
(グループ1にあることをキャプチャ)し、その後以外の任意の0+文字^
最初の一致が検出されたグループ2へ(文字列の先頭)、最初のグループは、空の文字列を保持しますグループ2及び(それは文字列の先頭であるように)最初の文字であるとしても(空の文字列を保持^
し、[^^]*
非マッチング文字の前に空の文字列を一致させることができる。全体のマッチがゼロ長であり、正規表現エンジンが移動次の位置に正規表現インデックスは。だから、最初に一致した後に、正規表現インデックスは、最初の後の位置に文字列の先頭から移動される^
。そして、第2の一致が発見され、第二^
及びそれの後に空の文字列であるのでまず、^
一致しない、それがスキップされます。
解決策は単純であるsplit
1:
String[] result = string.split("\\^", -1);
第二の引数は、メソッドの出力は、すべての結果の配列の終わりに一致を空にさせます。
参照してください。Javaのデモを:
String str = "^^^^";
String[] result = str.split("\\^", -1);
System.out.println("Number of items: " + result.length);
for (String s: result) {
System.out.println("\"" + s+ "\"");
}
出力:
Number of items: 5
""
""
""
""
""