0

私はRegExに関しては完全なアマチュアであり、ほんの数日前に始めたと言って、この前置きをさせてください。ファイルのフォーマットの問題を解決しようとしていますが、特定のタイプのデータで問題が発生しました。入力ファイルは次のように構成されています。

2つの単語、単語、単語、単語、「数、数」

私がする必要があるのは、このようにフォーマットすることです...

「2つの言葉」、「言葉」、「言葉」、「言葉」、「数、数」

私はの正規表現パターンを持っています

s /、/ "、" / g

すでに引用されているNumber、numberセクションのコンマも置き換えられることを除いて、機能します。これにより、フィールドが分​​離され、ファイルが分割されます。基本的に、パターンを変更してコンマを "、" [quoteコンマquote]に置き換える必要がありますが、そのコンマの後にスペースがない場合に限ります。他のフィールドには、コンマの後にスペースが含まれることはなく、区切られた番号のリストのみが含まれることに注意してください。

なんとか書き上げました

s /、[A-Za-z0-9] / "、" / g

これは、適切な文字列と一致している間、コンマと次の文字を置き換えます。私は後方参照について聞いたことがあり、それが私が使用する必要があるものかもしれないと思いますか?私の理解はそれでした

s /(、)[A-Za-z0-9] \ b

動作するはずですが、動作しません。

誰かアイデアがありますか?

4

4 に答える 4

2

私の経験では、これは正規表現の優れた使用法ではありません。既に述べたように、CSV ファイルは実際の CSV パーサーでより適切に処理されます。言語にタグを付けていないのでわかりにくいですが、perl では Text::CSV_XS または DBD::CSV を使用します (これにより、SQL は CSV ファイルをテーブルであるかのようにアクセスできます。もちろん、カバーの下で Text::CSV_XS を使用します)。自分で作成するよりもはるかに簡単で、正規表現を使用するよりもはるかに堅牢です。

于 2008-10-08T03:24:24.153 に答える
1

s/,([^ ])/","$1/" ," の後に "not-a-space" が続き、not-a-space をキャプチャしてから、全体をキャプチャした部分に置き換えます。

使用している正規表現エンジンによっては\1$1.

Perl を使用している場合、または否定先読みを使用する正規表現エンジンにアクセスできる場合s/,(?! )/","/(" ," の後にスペースが続かない) は機能します。

ただし、入力は CSV のように見えます。実際にそうである場合は、正規表現ではなく実際の CSV パーサーで解析する方がよいでしょう。他にも心配すべき奇妙なケースがたくさんあります。

于 2008-10-08T03:18:42.403 に答える
0

この質問は次のようなものです:正規表現呼び出しを使用して区切り文字内のパターンを置換します

これはうまくいくかもしれません:

s/"([^"]*)"|([^",]+)/"$1$2"/g
于 2008-10-08T03:43:24.553 に答える
0

Sedを使用しているようです。

あなたのパターンは少し矛盾しているように見えますが、コンマで区切られたすべてのアイテムを引用符で囲みたいと思っていると思います. それ以外の場合は、正規表現が処理することを意図していない計算上の複雑さの領域を見ています。

sed を使用すると、コマンドは次のようになります。

  sed 's/[ \"]*,[ \"]*/\", \"/g'

文字列の先頭と末尾に二重引用符を配置する必要があることに注意してください。

于 2008-10-08T03:47:50.457 に答える