Bash

使用正則表達式 posix 類的字元串驗證

  • June 16, 2018

我正在嘗試為文件中的地址欄位建立驗證

文件是這樣的;

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

這些是條件:

數字 - 至少一個數字,後跟任意數量的附加數字

街道名稱 - 任意數量的單詞(至少一個),每個單詞以大寫字母或數字開頭,後跟任意數量的小寫和大寫字母、數字或句點 (.)

編輯:在這些條件下,只有文件的前三行有效

這是我嘗試過的

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

但它似乎不起作用。有什麼幫助嗎?

至少一個數字,後跟任意數量的附加數字

+已經是“一個或多個”,因此[[:digit:]][[:digit:]]+至少需要兩個。所以[[:digit:]]+

每個以大寫字母或數字開頭的單詞(至少一個),後跟任意數量的小寫和大寫字母、數字或句點 (.)

大寫或數字:[[:upper:][:digit:]],這裡不需要交替 ( |),因為我們可以同時使用括號內的兩個字元類。

[[:alphabet:]]不是有效的字元類,但有alphaand alnum(用於字母或數字)。後者可能有用。

一句話:[[:upper:][:digit:]][[:alnum:].]*

多個單詞,每個單詞前面都有空格(也處理前導數字後面的空格):([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+

並且由於您想匹配整行,請在末尾添加^$,或使用grep -x. 您可能希望添加[[:blank:]]*到末尾(之前$)以允許容易意外留下的尾隨空白。

這只會列印範例輸入的前三行:

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

在https://regex101.com/中有一個用於玩正則表達式的線上工具 ,您可能會發現它對測試很有用。請注意,上述要求grep -E是因為+(替代方案很醜),但我認為 regex101 不允許使用普通的基本正則grep表達式。

引用自:https://unix.stackexchange.com/questions/450151