我想匹配几行,但它们可以结束不同。使用“注册商:”或“注册:”。
所以我天真地尝试了这个:
Registrant's address:(\s*)(?<Value>.*).*((Registrar:)|(Registered:))
这个OR运营商我有什么问题?
(目标是直接从WhoIs服务器使用RegEx从不同的tld中提取数据)
1。数据
域名: argos.co.uk
Registrant: Argos Ltd Registrant type: UK Public Limited Company, (Company number: 1081551) Registrant's address: Avebury 489-499 Avebury Boulevard Central Milton Keynes Milton Keynes MK9 2NW United Kingdom Registered through: NetNames Limited URL: http://www.netnames.co.uk
我想要这个:
Avebury 489-499 Avebury Boulevard Central Milton Keynes Milton Keynes MK9 2NW United Kingdom
2。数据
Domain name: amazon.co.uk Registrant: Amazon Europe Holding Technologies SCS Registrant type: Unknown Registrant's address: 65 boulevard G-D. Charlotte Luxembourg City Luxembourg LU-1311 Luxembourg Registrar: Amazon.com [Tag = AMAZON-COM] URL: http://www.amazon.com Relevant dates: Registered on: before Aug-1996 Expiry date: 05-Dec-2020 Last updated: 23-Oct-2013
我想要这个:
65 boulevard G-D. Charlotte Luxembourg City Luxembourg LU-1311 Luxembourg
答案 0 :(得分:3)
这似乎你不需要正则表达式
var result = String.Join(Environment.NewLine, File.ReadLines(filename)
.SkipWhile(x => !x.StartsWith("Registrant's address:"))
.Skip(1)
.TakeWhile(x => !String.IsNullOrEmpty(x)));
答案 1 :(得分:2)
正则表达式中的:
根本不在您的文字中,如果您尚未允许RegexOptions.Singleline
匹配新行,则需要指定.
。
Registrant's address:(\s*)(?<Value>.*).*((Registrar)|(Registered))
您有许多可能不必要的捕获组。
Registrant's address:\s*(?<Value>.*).*Regist(?:rar|ered)
另外请注意,如果您在尝试匹配的文本中有连续记录,则可能会遇到贪婪匹配问题。添加一些?
将解决问题:
Registrant's address:\s*(?<Value>.*?).*?Regist(?:rar|ered)
答案 2 :(得分:1)
您可以使用以下正则表达式仅匹配您需要的数据,而无需捕获不必要的数据。
使用环绕声断言:
(?<=Registrant's address:).*(?=(?:Registrar:|Registered:))
工作示例:
确保使用RegexOptions.Singleline
。
修改强>
要捕获指定组value
中的匹配,您将拥有以下内容:
(?<=Registrant's address:)(?<value>.*)(?=(?:Registrar:|Registered:))
示例: