我想要匹配几行,但它们可以结束不同的结局。加上“注册官:”或“注册:”。
所以我天真地尝试了这个:
Registrant's address:(\s*)(?<Value>.*).*((Registrar:)|(Registered:))
这个或操作员有什么问题?
(目标是使用RegEx从不同的tlds直接从用户服务器提取数据)
1.数据:
域名: argos.co.uk 注册人: Argos Ltd登记人类型:英国公共有限公司(公司编号: 1081551)登记人地址: Avebury 489-499 Avebury Boulevard Central Milton Keynes Milton Keynes MK9 2 2NW英国注册地址: NetNames Limited网址:http://www.netnames.co.uk
我想要这个:
Avebury 489-499 Avebury Boulevard Central Milton Keynes Milton Keynes MK9 2NW United Kingdom
2.数据:
域名: amazon.co.uk注册人:亚马逊欧洲控股技术有限公司注册类型:未知注册公司地址: 65大道G-D。卢森堡夏洛特卢森堡城LU-1311卢森堡注册官: Amazon.com Tag =Amazon.com网址:http://www.amazon.com相关日期:注册日期:1996年8月-之前到期日期:05-12月-2020年最后更新日期:2013年10月23日
我想要这个:
65 boulevard G-D. Charlotte Luxembourg City Luxembourg LU-1311 Luxembourg
发布于 2014-01-16 20:03:31
您可以使用以下正则表达式来匹配所需的数据,而不需要捕获不必要的数据。
使用查找断言:
(?<=Registrant's address:).*(?=(?:Registrar:|Registered:))
工作实例:
http://regex101.com/r/cN5wP3
只需确保使用RegexOptions.Singleline
即可。
编辑:
要捕获命名组value
中的匹配,您需要如下所示:
(?<=Registrant's address:)(?<value>.*)(?=(?:Registrar:|Registered:))
示例:
http://regex101.com/r/fY3oR9
发布于 2014-01-16 19:55:14
看来你不需要在这里
var result = String.Join(Environment.NewLine, File.ReadLines(filename)
.SkipWhile(x => !x.StartsWith("Registrant's address:"))
.Skip(1)
.TakeWhile(x => !String.IsNullOrEmpty(x)));
发布于 2014-01-16 19:55:22
正则表达式中的:
根本不存在于文本中,如果还没有允许.
匹配新行,则需要指定.
。
Registrant's address:(\s*)(?<Value>.*).*((Registrar)|(Registered))
您有许多捕获组可能是不必要的。
Registrant's address:\s*(?<Value>.*).*Regist(?:rar|ered)
另一个注意事项是,如果要匹配的文本中有连续的记录,那么贪婪匹配可能会遇到一些问题。添加几个?
将解决这个问题:
Registrant's address:\s*(?<Value>.*?).*?Regist(?:rar|ered)
https://stackoverflow.com/questions/21171421
复制相似问题