web-dev-qa-db-ja.com

行内の最初の出現箇所のみを正規表現に一致させる

私は正規表現を完全に理解していないので、どんな助けにも感謝します。

その作業は簡単です。このようなレコードを含むCSVファイルがあります。

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

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

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

38
cows_eat_hay

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

^([^,]+),

つまり

^        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 /

置換部分はちょうどマッチしたすべてのものを取り、あなたが覚えた最初のブロックでそれを置換し、そしてスペースを追加します。それが最初の捕獲グループにないので、コマは「落とされる」。

46
Mat
s/,/ /

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

6
Mork

もっと洗練された解決策は遅延マッチングを使うことです:

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

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

2
ghost28147

これは最初の数字とカンマ:^(\d{5}),のみに一致します。行内の他のすべてのものを見つけたければ、正規表現を次のように変更します。^(\d{5}),(.*)$

2
alex

TextPadは常にposix記法を使うことができたが、あなたは別のダイアログボックスで設定を変えなければならない。 TextPadのデフォルト設定を正規表現に使うには、開き括弧と閉じ括弧を "エスケープ"する必要があります。

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

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

タブ付き

\1\t

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

\(は「エスケープ括弧」であり、最初の検索式の先頭、つまり5桁の数字を表します。

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

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

[]は単なる空白文字です(角括弧は省いてもかまいませんが、このWebページでは誰も見ることができません:-)

置換式で

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

\ tはタブ文字です

そのため、search and replaceコマンドは1桁以上の数字とそれに続くスペースを検索します。それからそれはタブが続く数字の同じグループですべてを置き換えます。

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

これを知っている人は誰でも初心者にはこれについて知らないことを忘れています。それが私があなたのためにそれを詳しく説明している理由です、私の友人。

Ed Poor Math Tutor、引退したコンピュータープログラマー、ニューヨーク市

1
user423655