テキストがあり、この単純な正規表現を使用して単語に分割します: [ \n]
. スペースと改行を使用してテキストを単語に分割します。
いくつかの処理の後、これを単純な文の検出に使用するため、分割された単語に空白または改行を保持する方法があるかどうかを知りたいです。
String#split
メソッドを使用しています。
@Piotr Findeisenが提案したように、ルックビハインドを使用できます(+1):
public class RegexExample{
public static void main(String[] args) {
String s = "firstWordWithSpaceAfter secondWordWithSpaceAfter wordWithLineBreakAfter\nlastWord";
String sa[] = s.split("(?<=[ \\n])");
for (String saa : sa )
System.out.println("[" + saa + "]");
}
}
出力:
[firstWordWithSpaceAfter ]
[secondWordWithSpaceAfter ]
[wordWithLineBreakAfter
]
[lastWord]
簡単な説明:
?<=
は後ろを振り返ります。つまり、探している式の前のデータが後の正規表現と等しい場合に一致します?<=
(この場合[ \\n]
) 。
[ \\n]
の文字の1つを意味する正規表現です[]
したがって、正規表現全体は、式/単語の前の文字がスペースまたは。のいずれかであるたびにsplitと言います\n
。
スペースまたはを一致させようとしなかった\n
ため、それらは削除されません。
ゼロ幅の正の後読み/先読みの使用を検討してください。特殊な構成 (非キャプチャー)に関するパターン javadocを参照してください。
あなたの唯一の選択肢は、次のようなことだと思います:
String myString = "Joe Blow\n1234 Fake Road\nHere, There, 12345";
String[] lines = myString.split("\\n");
Set<String[]> wordsByLine = new LinkedHashSet<String[]>();
for (String line : lines) {
wordsByline.add(line.split(" "));
}
正規表現が常に単一の文字に一致する場合、長さを使用して、元の文字列のどこにあるかを判断できます。次に、区切り文字の部分文字列を取得できます。
少し汚いですが、うまくいくはずです。
あなたが何をしようとしているのかはまだわかりませんが、\n が " " とは異なる意味を持つ場合は、それらを個別に処理する必要があります。
String[] sentences = text.split("\\n");
...
for (String sentence : sentences) {
...
String[] words = sentence.split(" ");
...
}