正規表現を使用して、行内の最初の出現のみに一致


42

私は正規表現に完全に慣れていないので、助けていただければ幸いです。

タスクは簡単です。次のようなレコードを含むCSVファイルがあります。

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

すべての行について、最初のコンマをスペースに置き換え、残りのコンマはそのままにしておきます。最初のコンマのみに一致する正規表現はありますか?

私はこれを試しました:^.....,。これはコンマに一致しますが、コンマの前の文字列全体に一致するため、これをスペースで置き換えようとすると、すべての数字も削除されます。


どのツールを使用していますか?(sed、perl、awk、他に何か?)
マット

テキストパッド(Windows)
cows_eat_hay

回答:


53

一致するパターンは次のとおりです。

^([^,]+),

つまり

^        starts with
[^,]     anything but a comma
+        repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+)  remember that part
,        followed by a comma

たとえば、perlでは、全体の一致と置換は次のようになります。

s/^([^,]+),/\1 /

交換部品は、一致したものすべてを取得し、それを覚えている最初のブロックに置き換え、スペースを追加します。コマは最初のキャプチャグループにないため、「ドロップ」されます。


驚くばかり!マット、ありがとう。テキストパッドでは実際には機能しませんでした(正規表現は限られていると思います)ので、PowerGrepをダウンロードし、検索を使用して、指定した式に置き換えて、うまく機能しました。良い説明をありがとう、それは何が起こっているかを理解するのに役立ちます。
cows_eat_hay

7
s/,/ /

これは、デフォルトで(つまりgオプションなしで)、最初の一致のみを置き換えます。


1
これは実際にはテキストパッドの検索と置換の構文ですか?
ダニエルベック

1
これはsedperlおよびその他のツールの構文です。
パブーク

3

これは最初の数字とコンマのみに一致する必要があります^(\d{5}),。行内の他のすべてを飲み込みたい場合は、正規表現を次のように変更します。^(\d{5}),(.*)$


これもトリックを行いました。私は実際にマットのソリューションを使用することになりましたが、私もあなたのものをテストし、それは動作します。助けてくれてありがとう!
cows_eat_hay

なぜ\d{5}&はありませんか[^,]*?@少なくともより一般的です。
JustinCB

2

よりエレガントなソリューションは、遅延マッチングを使用することです:

s/^(.+?),/\1 /

最初のカンマ記号が見つかるまで、各ステップで文字列の先頭(^)から末尾に向かって1文字(.+?)移動することで文字をグループ化します。このグループはすべて、最初のコンマの出現とともに、グループ(\1)およびスペース文字に置き換えられます。


これは、コンマ(行上の単一の値)を含まない行とは一致しないことに注意してください。いずれかが一致する* 可能性よりも良好いずれかになり+そうs/^(.*?),/\1 /
ジェフPuckett

またs/^([^,]*),/\1 /、を実行することもできます。これは、コンマではなく、コンマで始まるものに一致します。また、s//一致しないものを変更しないことを知っていますか?
JustinCB

1

TextPadには常にPOSIX表記を使用する機能がありましたが、別のダイアログボックスで設定を変更する必要があります。正規表現にTextPadのデフォルト設定を使用するには、開き括弧と閉じ括弧を「エスケープ」する必要があります。

各行の先頭にある5桁の郵便番号の後にスペースを置き換えます

^\([0-9]+\)[ ]

タブ付き

\1\t

上記のように、^は行の始まりを意味します

\(は「エスケープされた括弧」であり、最初の検索式の開始、つまり5桁をマークします

[0-9] +は1桁以上の数字を意味します(5桁の郵便番号だけではありません)

\)は、最初の検索式の終わりを示す別の「エスケープされた括弧」です。

[]は単なるスペース文字です(角かっこは省略できますが、このWebページでは誰も見ることができません:-)

置換式で

\ 1は最初の検索式で、上の括弧で囲まれた部分(1桁以上)

\ tはタブ文字です

そのため、検索および置換コマンドは、1つ以上の数字とそれに続くスペースを探します。次に、すべてを同じ数字のグループとそれに続くタブに置き換えます。

「5桁の後に来るスペース」を単に見つける方法はないと思うので、数字に触れることなくスペースを置き換えることができます。5桁(最初の文字列)に続いてスペース(2番目の文字列)を見つける必要があります。次に、冗長または扱いにくいように見えますが、元の5桁の文字列をITSELFで置き換え、その後にタブ(2番目の文字列)を置きます。

これを知っている誰もが、初心者がこれについて知らないことを忘れています。だから、私はあなたのためにそれを綴ります、私の友人。

エド・プアー・マス・チューター、引退したコンピューター・プログラマー、ニューヨーク市


0

正規表現の最初の出現のみに一致させるには、すべてのフラグを削除します。各正規表現には次のフラグがあり、通常はデフォルトで複数のオカレンスに一致するグローバルフラグが使用されます。

  • / g =このフラグを使用すると、検索ではすべての一致が検索されますが、最初の一致のみが返されます
  • / i =大文字と小文字を区別しません
  • / m =複数行モード
  • / s = all。改行文字に一致するには\ n
  • / u = Unicode
  • / y =スティッキーモード(特定の場所で検索)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.