我正在尝试构建满足这些要求的正则表达式
号码街道名称
数字 - 至少一位数字,后跟任意数量的附加数字街道名称 - 任意数量的单词(至少一个),每个单词以大写字母或数字开头,后跟任意数量的大小写字母,数字或句号(。)。
有效字符串的示例是
“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”。但这没有任何帮助
答案 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"
尾随部分的规则对我来说并不完全清楚。大写或数字在开头是允许的,但不是小写的?