5

区切られた値を含む文字列があります。

1.95;1.99;1.78;10.9;11.45;10.5;25.95;26;45;21.2

私が達成したいのは、セミコロンの3回ごとの出現による分割であるため、結果には次のString[]ものが含まれる必要があります。

result[0] = "1.95;1.99;1.78";
result[1] = "10.9;11.45;10.5";
result[2] = "25.95;26;45";
result[3] = "21.2";

これまでにいくつかの正規表現ソリューションを試しましたが、セミコロンの間にあるパターンを見つけることしかできませんでした。例えば:

(?<=^|;)[^;]*;?[^;]*;?[^;]*

どちらが必要な値に一致するので、使用できsplit()ないか、何か不足していますか?

残念ながら、使用したパターンしか提供できず、上記のパターンの結果にループを追加する可能性はありません。

4

4 に答える 4

2
String re = "(?<=\\G[^;]*;[^;]*;[^;]*);";
String text = "1.95;1.99;1.78;10.9;11.45;10.5;25.95;26;45;21.2";
String[] result = Pattern.compile(re).split(text);

結果はあなたが望むものです
ヒント:Javaの正規表現の\ Gは、のような境界マッチャーであり^、「前の一致の終わり」を意味します

于 2012-05-09T13:31:17.033 に答える
1

代わりに、次のようなことを試すことができます。

String s = "1.95;1.99;1.78;10.9;11.45;10.5;25.95;26;45;21.2";
Pattern p = Pattern.compile(".*?;.*?;.*?;");
Matcher m = p.matcher(s);
int lastEnd = -1;
while(m.find()){
    System.out.println(m.group());
    lastEnd = m.end();
}
System.out.println(s.substring(lastEnd));
于 2012-05-09T13:17:36.937 に答える
0

次のようになります:

 ([0-9.]*;){3}

あなたのニーズに合わない?注意点は、末尾が存在することです。グループの終わりに。ただし、式を微調整してそれを削除できる場合があります。

質問を読み直しました。この単純な式はグループのマッチングには機能しますが、メソッドに提供する必要がある場合はsplit()、残念ながら機能しません。

于 2012-05-09T14:48:42.153 に答える
0

あなたは正しいです。Java は無期限の後読みアサーション (現在のセミコロンの前に 3、6、9、または 3*n の値があるかどうかを確認する場合に必要) をサポートしていないためsplit()、これには使用できません。あなたの正規表現は「すべてを見つける」アプローチで完全に機能しますが、状況にそれを適用できない場合は運が悪いです.

他の言語 (.NET ベースの言語など) では、次の正規表現が機能します。

;(?<=^(?:[^;]*;[^;]*;[^;]*;)*)
于 2012-05-09T12:50:17.007 に答える