使用正则表达式 posix 类进行字符串验证

使用正则表达式 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:]])+\.$'

但它似乎不起作用。有什么帮助吗?

答案1

至少一位数字,后跟任意数量的附加数字

+已经是“一个或多个”,所以[[: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正则表达式。

相关内容