文字列をトークン化する正規表現を作成しようとしています。文字列の例は次のとおりです。
"hello world" Alexandros Alex "I Am" Something
私は応答を返す必要があります:
hello world
Alexandros
Alex
I am
Something
明確にするために、スペースでトークン化しますが、引用符内の単語はトークン化しません。これが簡単な正規表現である場合は、事前に申し訳ありませんが、私は常にこれらに苦労しています。
あなたは試すことができます\b(?:(?<=")[^"]*(?=")|\w+)\b
:これにより、実際の引用符が一致から除外されます。
import java.util.regex.*;
public class Test {
public static void main(String...args) {
String line = "\"hello world\" Alexandros Alex \"I Am\" Something";
Pattern pattern = Pattern.compile("\\b(?:(?<=\")[^\"]*(?=\")|\\w+)\\b");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
}
}
実行すると、次の出力が得られます。
$ javac Test.java
$ java Test
hello world
Alexandros
Alex
I Am
Something
この正規表現は、引用符内の単語または文字列全体に一致します。"[^"]*"|\w*
この正規表現を使用してマッチャーを作成し、すべての一致を繰り返すことができます。ここでサンプルコードを見つけることができます
分割したい場合は、バランスが取れているか確認してください"
。
今、明らかにスペースが""
数の間にある場合は均等で"
はないでしょう..これは以下regex
が行うことです
\s(?=(?:([^"]*"[^"]*"[^"]*)*|[^"]*)$)