これが、この問題を解決するための(これまでの)最善の試みです。私は正規表現が初めてで、この問題はかなり深刻ですが、試してみます。正規表現をマスターするには明らかに時間がかかります。
これは区切り文字/コンマの要件を満たしているようです。が繰り返されるため、私には冗長に思えます/s*
。より良い方法がある可能性があります。
/\s*[,|\s*]\s*/
私はこれをSOFで見つけて、それをバラバラにして私の問題に適用しようとしています(簡単ではありません)。これは「引用」要件のほとんどを満たしているようですが、以下の要件の区切り文字の問題を解決する方法についてはまだ取り組んでいます。
/"(?:\\\\.|[^\\\\"])*"|\S+/
私が満たそうとしている要件:
- 文字列を文字列の配列に分割するために PHP preg_match_all() (または同様の) 関数によって使用されます。ソース言語は PHP です。
- 入力文字列内の単語は、(0 個以上の空白)(オプションのカンマ)(0 個以上の空白)または単に (1 個以上の空白)で区切られます。
- 入力文字列には、出力配列の単一の要素になる引用符で囲まれた部分文字列を含めることもできます。
- 入力文字列の引用符で囲まれた部分文字列は、出力配列に配置されたときに二重引用符を保持する必要があります (入力文字列で最初に引用されたものとして後で識別できる必要があるため)。
- 引用符で囲まれた部分文字列の先頭と末尾の空白 (つまり、二重引用符文字と文字列自体の間の空白) は、出力配列に配置するときに削除する必要があります。例: "<space>hello<space>world<space><tab>" は "hello<space>world" になります。
- 入力文字列の引用句内の空白は、出力配列要素に配置するときに 1 つのスペースに減らす必要があります。例: "hello<space><tab><space><space>world" は "hello<space>world" になります。
- 入力文字列内の引用符で囲まれた部分文字列で、長さが 0 であるか、空白のみを含むものは、出力配列に配置されません (出力配列には、長さが 0 の要素を含めることはできません)。
- 出力配列の各要素は、空白のために (左右に) トリミングする必要があります。
この例は、上記のすべての要件を示しています。
入力文字列:
"" 一二三四五六七 " " "
この配列を返します (以下に示す文字列には二重引用符が実際に存在します)。
{一二三四五六七"}
編集 2013 年 9 月 13 日
私は数日間正規表現を一生懸命勉強してきましたが、最終的にこの提案された解決策に落ち着きました。それは最高ではないかもしれませんが、それが現時点で私が持っているものです.
この正規表現を使用して、PHP の preg_match_all() 関数を使用して検索文字列を配列に分割します。
/(?:"([^"]*)"|([^\s",]+))/
先頭/末尾の「/」は、php 関数 preg_match_all() に必要です。
配列が作成されたので、次のように関数呼び出しから取得します。
$x = preg_match_all(REGEX);
$Array = $x[0];
関数は複合配列を返し、要素 0 には正規表現の実際の出力が含まれているため、これを行う必要があります。返された他の要素には、正規表現によってキャプチャされた値が含まれていますが、これは必要ありません。
ここで、結果の配列を反復処理し、要件 (上記) を満たすように各要素を処理します。これは、単一の正規表現を使用して単一のステップですべての要件を満たすよりもはるかに簡単です。