匹配以特定单词

时间:2018-04-06 19:37:09

标签: c# .net regex

鉴于一个包含多个域名的字符串,我需要仅匹配该行以" global"开头的域名。它们必须是个人匹配而不是群组。

正则表达式是PCRE / .NET 4.7。相同的正则表达式将用于其他PCRE工具,如BMC软件工具。

字符串内容:

upstream domain-name some.domain.com some.domain.net 
upstream domain-name another.domain.com 
global domain-name some.domain.com some.domain.net
global domain-name some.domain.local 
downstream domain-name some.domain.com some.domain.net 
downstream domain-name some.domain.com

例如,从global开头的行,我希望将somedomain.com some.domain.net some.domain.local作为3个单独的匹配项返回(MatchCollection

我知道我可以使用(?<=global domain-name ).*,但我必须string.Split()some.domain.com之间的空格some.domain.net。这不是一个完全糟糕的解决方案,但我真的希望这些比赛是个人的。

我越来越接近(?<=global domain-name )\S*,但它只返回遇到的第一个域名给我输出:

somedomain.com
somedomain.local

并且不匹配somedomain.net

我已经玩了好几个小时了,并且一直在想\G是否可能是一个选项,但我对此并不了解,也无法得到它工作。

我确定解决方案非常简单,但我对Regex并不是很满意,所以我们非常感谢任何模式帮助!

2 个答案:

答案 0 :(得分:0)

如果您在global行上添加前缀以包含可选域名,则会在一个表达式中执行此操作:

var ans = Regex.Matches(src, @"(?<=^global +[\w-.]+ +(?:[\w-.]) +)*)[\w-.]+", RegexOptions.Multiline);

注意:这在PCRE中不起作用,PCRE不支持不同的长度。

答案 1 :(得分:0)

这可能是匹配和提取你想要的东西

(?m)(?<=^\s*global.*?\s)[\w\.]+\b\.(?:com|net|local)(?=\s|\n|$)

click ,,,其中应用了variable-length lookbehind,因为.NET regex支持它。