使用具有相同捕获名称的正则表达式捕获部分或全部

时间:2014-11-26 10:28:06

标签: regex

给出以下两个字符串:

\06086-afde-4e46-8886-@xxx.com\0xxx7ccd-6293-4343-8e50-xxx

\0name.surname@xxx.com\0xxx6293-4343-8e50-e1d5-xxx

我尝试提取6086-afde-4e46-8886-(id为guid)或name.surname@xxx.com(如果它不是guid)。这里的困难在于捕获的组必须具有相同的名称。

到目前为止,我有  (?<name>(?:\w{4}-){4}|[a-zA-Z.]{1,}@xxx\.com),但这也会捕获我不想要的 7ccd-6293-4343-8e50 - 6293-4343-8e50-e1d5 - 。< / p>

我也在想\\\0(?<name>(?:\w{4}-){4}|[a-zA-Z.]{1,}@xxx\.com)(?:(?:@xxx\.com)?\\\0),之类的东西 但是有没有办法不重复xxx.com部分(因为它比这更复杂)。此外,这依赖于查找我不想要的\\0,因为我不知道这是否会在字符串中的其他位置找到。

谢谢..

3 个答案:

答案 0 :(得分:1)

以下正则表达式将数字6086-afde-4e46-8886-和电子邮件name.surname@xxx.com匹配到相同的组名中,而不使用开始序列\ 0

(?<_name_>[A-Za-z]+\.[A-Za-z]+@xxx\.com|(?:[\w]{4}-){4}(?=@xxx\.com))

此正则表达式使用正面预测(?=@xxx\.com)来匹配数字,而不需要@xxx.com

答案 1 :(得分:0)

试试这个

\\0(?<_name_>(?:[\w\-\.]+))@xxx\.com

并在方括号内添加所有允许的字符

演示:http://regexhero.net/tester/?id=be0fed5e-1d24-43cc-9db9-812311c17d61

答案 2 :(得分:0)

好像你正试图获得第一场比赛。如果是,请尝试以下正则表达式。

^.*?(?<name>(?:\w{4}-){4}|[a-zA-Z.]{1,}@xxx.com)

http://regex101.com/r/jC3uR4/5