正则表达式 - 通过排除部分字符串来查找字符串

时间:2016-09-29 16:00:25

标签: regex

我有文字:"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"

3 个答案:

答案 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+)和后续数字。

这里有效:https://regex101.com/r/YGiaJT/1