3

その部分がどのように機能するかについて、私は間違った考えを持っていると思います{3,5}

私の理解では、検索結果を返すために数字が準拠しなければならない範囲を指定していますか?

たとえば3,5、検索を返すための 3 ~ 5 桁を意味します。いくつかの実験で、私の論理が正確ではないことに気付きました。

3~5文字、8、9、10文字まで適用されるようです。

ここにパターンがありませんか?もっと簡単に言えば、誰かがその背後にあるロジックを説明してもらえますか? 単純に 3 の倍数ですか、それとも 5 ですか。3〜5の範囲を含む?ここで本当に混乱しました。ありがとう!

user@matrix:~> エコー 1234567891234 | grep '[0-9]{3,5}'

1234567891234

上記は正常に一致しました。12 文字が含まれていました...

4

4 に答える 4

2

あなたが書いたとおりに動作しています:

grep '[0-9]\{3,5\}'  - Is there 3 to 5 sequential numeric characters in this string?

文字列が の場合、1234567891234そこに 3 ~ 5 個の数字を含むサブ文字列があります。

3 文字から 5 文字の数字のみを含み、5 文字以下の文字列のみに関心がある場合は、正規表現にいくつかの境界を設定する必要があります。-E正規表現の最新バージョンを使用するフラグも使用する必要があります。

$ echo 12345678901234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"

これは何も出力しませんが、次のようになります。

$ echo 1234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"

この:

$ echo 12345aaa6789aaa01234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"

最初のもの(^|[^0-9])、行の先頭 (それが先頭です^)、または文字 0-9 以外のいずれかを示します。(それは[^0-9]です)。(...|...)拡張正規表現でを使用すると、左側の式または右側の式のいずれかを意味します。同じことが、([^0-9]|$)非数値または行末のいずれかを示す末尾にも当てはまります。

真ん中はあなたです[0-9]{3,5}(拡張式にバックスラッシュは必要ありません)。これは、3桁から5桁の間です。そして、どちらの側も数字以外、または文字列の最初または最後にバインドされているため、これはあなたが望むことを行います.

いくつかのこと:

$ echo 12345aaa6789aaa01234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"

$ grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)" <<<"12345aaa6789aaa01234"

ほとんど同じことを意味します。ただし、実行する必要があるプロセスは 1 つだけで、パイプがないため、2 番目の方法の方が効率的です。さらに、入力するのが短くなります。

また、文字クラスを使用できます (使用することをお勧めします)。

$ grep -E "(^|[^[[:数字:]])[[:数字:]]{3,5}([^[:数字:]]|$)"<<<"12345aaa6789aaa01234"

これにより、ラテン英数字を使用する場所にいなくても、正規表現が機能します。\dは と同じクラスであるため、これは同じことを行うためのより短い方法です[:digit:]

$ grep -E "(^|[^\d])\d{3,5}([^\d]|$)"<<<"12345aaa6789aaa01234"
于 2013-08-14T21:37:31.800 に答える
2

{3,5} は、その前にあるクラスで選択された文字の繰り返しを定義しているという前提で正しいです - 3 から 5 (両方を含む) の繰り返しです。{3,}「少なくとも3回」という意味のようなこともできます

-Exオプションを使用します。Eこれにより、括弧の前にスラッシュを使用するx必要がなくなり、行全体を一致させることができます。

[alfasin@otrs ~]$ echo 1234567891234 | grep -Ex '[0-9]{3,5}'
[alfasin@otrs ~]$ echo 1234567891234 | grep -Ex '[0-9]{3,13}'
1234567891234

grep マニュアルから:

-E, --extended-regexp PATTERN を拡張正規表現 (ERE、以下を参照) として解釈します。(-E は POSIX で指定されています。)

-x, --line-regexp 行全体に正確に一致する一致のみを選択します。(-x は POSIX で指定されています。)

于 2013-08-14T21:05:36.547 に答える
2

オプションを使用して、-ogrep がどのように機能するかを視覚化できます。

echo 1234567891234 | grep -o '[0-9]\{3,5\}'

出力:

12345
67891
234

-o出力に一致するたびに新しい行を追加します。そのオプションがないと、grepは一致が発生した行全体を出力するだけです-入力文字列自体になります。この方法では、grep がどのように文字列と正確に一致したかを確認できません。

しかし今、grep がその行で 2 回の 5 桁の文字列と 1 回の 3 桁の文字列の複数の一致を見つけたことがわかります。

また、オプション{}を使用しない限り、ブラケットの前にスラッシュが必要です。-E

于 2013-08-14T21:00:08.757 に答える
1

その特定の正規表現を使用すると、入力文字列の最初の 5 文字が一致します(視覚化)。一致がgrep見つかると、処理を停止し、一致する行を返します。その試合以外には何にも注意を払っていません。

正確に3 ~ 5 桁の孤立したシーケンスのみに一致するものを探している場合は、次のような正規表現を試してください。

\b[0-9]{3,5}\b

' \b' は単語の境界に一致します。つまり、単語の文字 (文字、数字など) と単語以外の文字 (空白、句読点など) の間の遷移を意味します。これにより、 の一致は生成されますが、 orの一致は生成され1234ません。121234567891234

より強力な方法としてルックアラウンドを使用して、マッチの前後に数字がないことを確認することもできます。ただし、ルックアラウンドに対する grep のサポートは完全ではないようです。そのため、代わりに perl などを使用する必要がある場合があります。

于 2013-08-14T22:03:23.470 に答える