これは、PerlFAQのセクション4で回答されたよくある質問に関連しています。
[文字]内を除いて、[文字]で区切られた文字列を分割するにはどうすればよいですか?
Text :: Balanced、Text :: CSV、Text :: CSV_XS、Text :: ParseWordsなど、いくつかのモジュールでこの種の解析を処理できます。
カンマ区切りの文字列を別のフィールドに分割しようとする例を見てみましょう。split(/,/)
カンマが引用符で囲まれている場合は分割しないでください。使用できません。たとえば、次のようなデータ行を考えます。
SAR001、 ""、 "Cimetrix、Inc"、 "Bob Smith"、 "CAM"、N、8,1,0,7、 "エラー、コアダンプ"
引用符の制限により、これはかなり複雑な問題です。ありがたいことに、 Mastering RegularExpressionsの著者であるJeffreyFriedlが、これらを処理してくれます。彼は提案します(あなたの文字列がに含まれていると仮定して$text
):
my @new = ();
push(@new, $+) while $text =~ m{
# groups the phrase inside the quotes
"([^\"\\]*(?:\\.[^\"\\]*)*)",?
| ([^,]+),?
| ,
}gx;
push(@new, undef) if substr($text,-1,1) eq ',';
引用符で区切られたフィールド内で引用符を表す場合は、バックスラッシュでエスケープします(例"like \"this\""
:) 。
あるいは、Text :: ParseWordsモジュール(標準のPerlディストリビューションの一部)では、次のように言うことができます。
use Text::ParseWords;
@new = quotewords(",", 0, $text);
ただし、CSVの解析または生成には、自分で実装するのではなく、Text::CSVを使用することを強くお勧めします。何年にもわたって本番環境ですでに試行およびテストされているコードを使用するだけで、後で発生する奇妙なバグを回避できます。
あなたの状況にテクニックを適応させることは
my $htmlVal = 'word "word word" word';
my @chunks;
push @chunks, $+ while $htmlVal =~ m{
"([^\"\\]*(?:\\.[^\"\\]*)*)"
| (\S+)
}gx;
$htmlVal = join "||", @chunks;
print $htmlVal, "\n";
出力:
ワード||ワードワード||ワード
振り返ってみると、これは、 MarkDominusによる正規表現マスタリーで吹き替えられたRandalのルールの適用であることがわかります。
ランダルのルール
キャプチャを使用するかm//g
、保持したいものがわかっている場合に使用します。
split
捨てたいものがわかっているときに使用します。
あなたの状況では、あなたはあなたが何を残したいのかを知っているので、m//g
引用符で囲まれたテキスト、または空白で区切られたテキストに固執するために使用してください。