文字列の正確な桁数を一致させます。

文字列の正確な桁数を一致させます。

文字列が与えられたら、正確に7つの連続した数字が含まれているかどうかを確認する方法は?

たとえば、1505082または1505082_CSE_322そうでない、15050821または15050821_CSE_322

頑張った

grep -Eq [0-9]{7} <<< "1505082" 

戻ってき0ますが

grep -Eq [0-9]{7} <<< "15050821"` 

また返されました0

私は何が間違っていましたか?

ベストアンサー1

はい、次のようになります(正規表現を引用しない場合はシェルグローブとして解釈されます)。

grep -Eq '[0-9]{7}' <<< "1505082"

grepは7桁の数字と一致します。 qを次に置き換えると、一致するものを確認できますo

$ grep -Eo '[0-9]{7}' <<< "1505082"; echo "$?"
1505082
0

はい、これも一致します:

$ grep -Eq '[0-9]{7}' <<< "150508299999"; echo "$?"
1505082
0

9をすべて削除します。
問題は、固定されていない一致を実行していることです。これは7桁の数字です(以上)数字。

あなたはできますアンカーそして:

$ grep -Eq '^[0-9]{7}$' <<< "15050829999"; echo "$?"
1

7桁の数字の一致どこかに数字以外の数字が後ろまたは前に来る場合は、まったく異なるアンカーが必要です。

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082"; echo $?
1505082
0

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082_CSE_322"; echo $?
1505082
0

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082999_CSE_322"; echo $?
0

これはプレビュー一致で、1つは振り返りです。

(?<=^|[^0-9])

^文字列()の先頭または数字以外の項目と一致します。もう一つはプレビューです。

(?=[^0-9]|$)

数字または文字列の終わり以外の項目と一致します。


より単純な正規表現を使用する唯一の代替方法は、ランダムなExtended(またはそれ以上の)数を抽出し、7それが正確に7桁であることを確認することです。

$ echo "150508299_CSE_322" | 
          grep -oE '[0-9]{7,}' | 
                  grep -qE '^[0-9]{7}$'; echo "$?"
1

おすすめ記事