正規表現 posix クラスを使用した文字列の検証

正規表現 posix クラスを使用した文字列の検証

ファイルのアドレスフィールドの検証を構築しようとしています。

ファイルは次のようになります。

123 Strata Ln.
15 138th Ave
27 Hilltop Dr. Apt. 7
F52 Milk Ln.
156A Fantastic St.
56 sample Ln.

条件は次のとおりです。

数字 - 少なくとも1桁以上、その後に追加の数字が続きます。

距離名 - 大文字または数字で始まり、その後に小文字と大文字、数字、またはピリオド(.)が続く任意の数の単語(少なくとも1つ)

編集:これらの条件では、ファイルの最初の3行のみが有効です。

私が試したことは次のとおりです。

'^[[:digit:]][[:digit:]]+ ([[:upper:]]|[[:digit:]])([[:alphabet:]]|[[:digit:]])+\.$'

しかし、うまくいかないようです。助けが必要ですか?

答え1

少なくとも1つの数字、その後に任意の数字の追加の数字が続きます。

+すでに「1つ以上」なので、[[:digit:]][[:digit:]]+少なくとも2つが必要です。だから[[:digit:]]+

それぞれ大文字または数字で始まり、その後に任意の数の小文字と大文字、数字、またはピリオド(.)が続く単語(少なくとも1つ)

大文字または数字:括弧内に両方の文字クラスを使用できるため、ここでは[[:upper:][:digit:]]()を交互に使用する必要はありません。|

[[:alphabet:]]有効な文字クラスではありませんが、alphaand alnum(文字または数字用)があります。後者が役に立つかもしれません。

一文で:[[:upper:][:digit:]][[:alnum:].]*

各単語の前にスペースがある複数の単語(前の数字の後のスペースも処理可能):([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+

行全体を一致させるには、最後に^andを追加するか、を使用します。誤って残りやすい末尾のスペースを許可するには、最後(前)に追加する必要があります。$grep -x[[:blank:]]*$

これにより、サンプル入力の最初の3行だけが印刷されます。

grep -E '^[[:digit:]]+([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+$' file

正規表現を使用するためのオンラインツールがあります。https://regex101.com/ これはテストに役立ちます。上記の要件は(代替案が醜いためgrep -E)ですが、regex101は単純な基本正規表現を+許可しないと思います。grep

関連情報