2014-10-19 55 views
0

给定一个字符串象:正则表达式匹配的公倍数初始令牌以下令牌

ASSUME @pete, @grey and @matt_c ARE really tall 

是有办法我可以使用正则表达式来提取:

MATCH 1 
1. `@pete` 
2. `really tall` 
MATCH 2 
1. `@grey` 
2. `really tall` 
MATCH 3 
1. `@matt_c` 
2. `really tall` 

此外,有一种方法可以每个人都可以选择@是否可选?

限制条件:语法必须是这样的形式都假设[名称]为[语句]其中:

  • [名称]由一个或多个[名称] S通过,(space)&分离或and
  • [名]由字母数字+下划线或破折号

乐意回答有关设置的任何问题。与示例字符串我试图让工作的一个起点可以在这里找到:http://regex101.com/r/fS9oK5/4

+0

这是基于朋友的实现 - 试图处理空格,与符号,逗号和“和”。实现我的范围稍窄,将更新问题。 – 2014-10-19 03:09:50

+0

谢谢,这几乎是我以后的 - 但我真的很想匹配每个名称与末尾部分 – 2014-10-19 03:14:11

回答

1

你可能会需要使用Positive Lookahead来捕获重叠匹配。

(?=(@[\w-]+).*ARE\s*(.+)) 

Live Demo

+0

这看起来几乎正是我之后(添加快速更改匹配破折号)!为edu-链接,以及有点阅读我在那里... – 2014-10-19 03:28:45

+0

在进一步检查,这不明确地匹配在ASSUME权利?所以线可以从任何东西开始? – 2014-10-19 04:01:16

+0

这是正确的。 – hwnd 2014-10-19 04:04:38

1

我想你想这样的事情,

ASSUME (@\w+(?:(?:,?\[email protected]\w+)*\s*and\s*@\w+)?)\sARE\s(.+) 

DEMO

+0

真的很接近,但我正在寻找每个名称与结束部分单独。此外,我忘了提及破折号和下划线在名称中是可以接受的,尽管它并没有改变你的方法,我不认为。这大致是我目前所需要的:( – 2014-10-19 03:18:09

+0

)请更新您的演示链接,并添加一些反映上述行为的线路。 – 2014-10-19 03:19:17

+0

完成。http://regex101.com/r/fS9oK5/4 - 谢谢您的存在 – 2014-10-19 03:21:30

0

从接受的答案有点变化:
你实际上消耗的第一子图案

(@[\w-]+)(?=.*ARE\s(.+)) 

Demo

明确匹配ASSUME,取决于你的引擎和\G选择离子

(?:^ASSUME\s*|\G[^@]*)(@[\w-]+)(?=.*ARE\s(.+)) 

Demo

+0

虽然对ASSUME没有明确的匹配?所以线可以从任何东西开始? – 2014-10-19 03:59:42

+0

就像接受的答案! – 2014-10-19 04:01:05

+0

增加了匹配'ASSUME' – 2014-10-19 04:06:04

相关问题