1. ホーム
  2. java

[解決済み] シングルクォートまたはダブルクォートで囲まれていない場合に、スペースを使って文字列を分割するための正規表現

2022-07-31 23:26:23

質問

正規表現に慣れていないので、教えてください。 私は、シングルまたはダブルクォートで囲まれていないすべてのスペースを使用して、例の文字列を分割する式をまとめようとしています。私の最後の試みは次のようになります。 (?!") のようになり、うまくいきません。引用符の前のスペースで分割されています。

入力例です。

This is a string that "will be" highlighted when your 'regular expression' matches something.

希望する出力

This
is
a
string
that
will be
highlighted
when
your
regular expression
matches
something.

なお "will be"'regular expression' は単語と単語の間のスペースを保持します。

どのように解決するのですか?

他の人たちがなぜこのような複雑な正規表現や長いコードを提案するのか理解できません。 本質的に、あなたは文字列から 2 種類のものを取得したいのです: スペースまたは引用符以外の文字のシーケンス、および 2 種類の引用符のために、間に引用符を含まない、引用符で始まり、終了する文字のシーケンスです。 この正規表現を使えば、これらのものに簡単にマッチさせることができます。

[^\s"']+|"([^"]*)"|'([^']*)'

リストに引用符があると困るので、キャプチャグループを追加しました。

このJavaコードはリストを構築し、引用符を除外するためにマッチした場合は捕捉グループを追加し、捕捉グループがマッチしなかった場合(引用符のない単語がマッチした)には全体の正規表現マッチを追加しています。

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    if (regexMatcher.group(1) != null) {
        // Add double-quoted string without the quotes
        matchList.add(regexMatcher.group(1));
    } else if (regexMatcher.group(2) != null) {
        // Add single-quoted string without the quotes
        matchList.add(regexMatcher.group(2));
    } else {
        // Add unquoted word
        matchList.add(regexMatcher.group());
    }
} 

もし、返されるリストに引用符があることを気にしないのであれば、もっと簡単なコードを使うことができます。

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
}