我有文字:"Johnny Alan Walker Sint Jansstraat 7, 1012 HG Amsterdam +123456789012"
可以查找姓氏和手机吗?
排除地址?
地址正则表达式是这样的:"([A-Z]{1,}[a-z]{1,}\s){2}[0-9]{0,4}\,\s{1,}[0-9]{4}\s[A-Z]{2}\s{1,}[a-zA-Z]{1,}"
(两个词来自大写,housenumber,逗号,邮政编码和城市)
我希望结果字符串为"Walker +123456789012"
答案 0 :(得分:1)
你可以做....
\w+\s+\w+\s+(\w+).*(\+\d+)
你的捕捉群体应该与你想要匹配的东西相匹配......
基本上这将是"忽视"你的第一个和第二个"单词" (第一个/中间名),然后从中间忽略一切,直到找到一个+然后捕获它后面的数字。
实例:https://regex101.com/r/MjJCSv/1
理论上,如果您的姓氏和地址总是间隔超过1个空格,您可以将其缩短一点并将其写为
(\w+)\s{2,}.*(\+\d+)
此功能的实例:https://regex101.com/r/vGGB4z/1
java中后面的示例实现:http://ideone.com/RExAEO
答案 1 :(得分:1)
您可以使用以下内容仅捕获姓氏和电话号码。
第一部分((\w+\s){3}
)将捕获一个单词后面跟一个空格的3 rd 出现。
第二部分(.+?
)将捕获所有内容
第三部分((\+?\d+)$
)将捕获可选的+
(电话号码前缀)和电话号码的其余部分,直到字符串的末尾。
(\w+\s){3}.+?(\+?\d+)$
\1
- 姓氏\2
- 电话号码https://regex101.com/r/gqu0tt/4
但是,如果姓氏和地址分隔的空格超过1,那么你可以使用
(\w+)\s{2,}.+?(\+?\d+)$
\1
- 姓氏\2
- 电话号码https://regex101.com/r/gqu0tt/5
我tested these expressions on the Java engine,他们回馈正确的匹配
答案 2 :(得分:1)
这应该做你需要的,也不假设三个名字(没有中间名称的作品),所以如果你遇到没有中间名的人的条目,它会更灵活一些:
.*?(\w+)\s*(?:[A-Z]{1,}[a-z]{1,}\s){2}[0-9]{0,4}\,\s{1,}[0-9]{4}\s[A-Z]{2}\s{1,}[a-zA-Z]{1,}\s*(\+\d+)
.*?(\w+)\s*
- 在地址前面的空白处捕获最后一个单词。 .*?
会懒散地匹配地址前面的单词,但不会捕获。 \s*
将匹配单词和地址之间的空格。(?:[A-Z]{1,}[a-z]{1,}\s){2}[0-9]{0,4}\,\s{1,}[0-9]{4}\s[A-Z]{2}\s{1,}[a-zA-Z]{1,}
- 您的地址正则表达式但使用非捕获组(?:
)\s*(\+\d+)
- 捕获+
及以下数字。 \s*
将匹配地址与+
。我重用了你的地址正则表达式,但使捕获组无法捕获。然后,我们使用(\w+)
匹配地址(姓氏)前的最后一个字,使用+
匹配地址后面的(\+\d+)
和后续数字。