用于验证BASH中地址的正则表达式

时间:2018-02-06 23:54:11

标签: regex

我正在尝试构建满足这些要求的正则表达式

号码街道名称

数字 - 至少一位数字,后跟任意数量的附加数字街道名称 - 任意数量的单词(至少一个),每个单词以大写字母或数字开头,后跟任意数量的大小写字母,数字或句号(。)。

有效字符串的示例是

“123 Milk Ln。”

“15090 178th Ave”

“27 Hilltop Dr. Apt.7”

无效字符串的示例是

“F52 Milk Ln。”

“156A Fantastic St。”

“56样本Ln。”

“1838 Dykhouse Ave.”

             ^ extra space on the end

“1832 7th st。”

任何有关正则表达式的帮助都将受到赞赏

我尝试了以下它在regex101.com上运行,但它在BASH中不起作用

    ^\d+ [\dA-Z](?: *[\da-zA-Z.])+$

我想帮助一个在BASH中工作的人

我有这个给予

“Turkstra,Jeffrey A.; 1523 Magic Ln。”

当我这样做时

    cut -d';' -f2 addr1 | egrep -x '^\d+ [\dA-Z](?: *[\da-zA-Z.])+$' 

我想让它返回“1523 Magic Ln”。但这没有任何帮助

1 个答案:

答案 0 :(得分:1)

我还没有看到\ d - 密码表示法,但是[0-9]或[:digit:]。

egrep -o '[0-9]+ [0-9A-Z][0-9A-Za-z]+( *[0-9a-zA-Z.]+)' addr1

收益1523 Magic Ln.

egrep -x '^\d+ [\dA-Z](?: *[\da-zA-Z.])+$' 

从我阅读的grep的联机帮助页中,-x测试整行以进行匹配,而不仅仅是测试它的一部分,就好像你在^...$中保护你的表达一样,但你同时做到了。

cut -d';' -f2 addr1 | egrep -x '\d+ [\dA-Z](?: *[\da-zA-Z.])+'

不匹配。也不是:

cut -d';' -f2 addr1 | egrep -x '[0-9]+ [0-9A-Z](?: *[0-9a-zA-Z.])+'

这是为什么? '[0-9] +'匹配'1523','[0-9A-Z]'匹配'M','(?:* [0-9a-zA-Z。])+'应匹配? 'agic Ln。'。你能解释'?:'吗?

也许grep的语法也是未知的?

到目前为止我们有什么:

cat addr1
Turkstra, Jeffrey A.;1523 Magic Ln.
"123 Milk Ln."
"15090 178th Ave"
"27 Hilltop Dr. Apt. 7"
"F52 Milk Ln."
"156A Fantastic St."
"56 sample Ln."
"1838 Dykhouse Ave. "
"1832 7th st."

命令:

egrep -o '[0-9]+ [0-9A-Z][0-9A-Za-z]+( *[0-9a-zA-Z.]+)' addr1        
1523 Magic Ln.
123 Milk Ln.
15090 178th Ave
27 Hilltop Dr.
52 Milk Ln.
1838 Dykhouse Ave.
1832 7th st.

好的,应该保留-x或^ ... $组合中的一个,因为我们不需要F52 Milk Ln,甚至不需要部分。

由于一些有智慧的人在“测试数据中”,我们也需要包含它们:

 egrep -o -x '"[0-9]+ [0-9A-Z][0-9A-Za-z]+( *[0-9a-zA-Z.]+)"' addr1 
"123 Milk Ln."
"15090 178th Ave"
"1832 7th st."

1832行错了,因为......?我们错过了Apt博士。 7,因为我在parens中移动了+,但我们需要它们进出:

egrep -o -x '"[0-9]+ [0-9A-Z][0-9A-Za-z]+( *[0-9a-zA-Z.]+)+"' addr1 
"123 Milk Ln."
"15090 178th Ave"
"27 Hilltop Dr. Apt. 7"
"1832 7th st."

这是Hilltop Drive。 1832年7月7日只会在第7街有效,对吗?

 egrep -o -x '"[0-9]+ [0-9A-Z][0-9A-Za-z]+( [A-Z0-9]([0-9a-zA-Z.]*))+"' addr1
"123 Milk Ln."
"15090 178th Ave"
"27 Hilltop Dr. Apt. 7"

尾随部分的规则对我来说并不完全清楚。大写或数字在开头是允许的,但不是小写的?