使用正則表達式 posix 類的字元串驗證
我正在嘗試為文件中的地址欄位建立驗證
文件是這樣的;
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:]]
不是有效的字元類,但有alpha
andalnum
(用於字母或數字)。後者可能有用。一句話:
[[: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
表達式。