我正在尝试构建一个正则表达式来帮助我解析大量的robots.txt文件。我试图找出是否禁止使用特定的用户代理。
文件看起来大致与他的相似,但可能会因空白而有所不同:
User-agent: *
Disallow: /next/
User-agent: *
Disallow: /mshots/v1/
# har har
User-agent: *
Disallow: /activate/
User-agent: *
Disallow: /wp-login.php
User-agent: *
Disallow: /signup/
User-agent: *
Disallow: /related-tags.php
到目前为止,我已经提出了这个正则表达式:
user-agent.*:(.*$)
为多行和ignorecase设置选项。
这适用于我的要求的用户代理部分,但现在我需要匹配在声明另一个dissallow
之前出现的任何user-agent
字。我尝试过匹配$
和\r\n
,但我无法弄清楚如何在$
之后保持匹配。我之后添加的任何模式似乎都不起作用。例如:
user-agent.*:(.*$)(^.*disallow)
我正在尝试匹配换行符然后拒绝,但它不匹配。此外,我不确定如何在user-agent
之前终止匹配,并且仍然可以使用最后一个声明规则。
有人能指出我正确的方向吗?
答案 0 :(得分:2)
您可以使用
(?i)user-agent.*:(.*)([\r\n]\s*.*disallow)
请参阅regex demo。您在此处不需要RegexOptions.Multiline
选项,因为无需使用^
,也不需要$
来重新定义其行为。
<强>详情
(?i)
- 不区分大小写的修饰符user-agent
- 文字子字符串.*
- 除了换行符之外的任何0 +字符,尽可能多:
- 冒号(.*)
- 第1组:除了换行符之外的任何0 +字符,直到行尾([\r\n]\s*.*disallow)
- 第2组:
[\r\n]\s*
- 换行符(CR或LF),然后是0 +空格.*
- 除了换行符之外的任何0 +字符,尽可能多disallow
- 子字符串答案 1 :(得分:2)
您的问题似乎与cifilter?.setValue(NSNull(), forKey kCIImageColorSpace)
和User-agent: *
之间的换行符不符。
这样的正则表达式应该有效:Disallow
此正则表达式将捕获/^user-agent: (.*)$[\s]^disallow: (.*)$/igm
的值和User-agent
的值,并适用于任何类型的换行符。
Disallow
标记表示案例 - I nsensitive, G lobal和 M ultiline
您可以使用regexr进行测试。
答案 2 :(得分:1)
您可以使用SingleLine
选项和以下正则表达式:
String pattern = @"user-agent[^\r\n]*: ([^\r\n]+)[\r\n]+disallow[^\r\n]*: ([^\r\n]+)[\r\n]+";
foreach (Match match in Regex.Matches(robots, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline))
{
Console.Out.WriteLine("---------");
Console.Out.WriteLine("Match: `" + match.ToString() + "`");
foreach (Group grp in match.Groups)
{
Console.Out.WriteLine(" Group: ``" + grp.ToString() + "``");
}
}
打破模式:
文字user-agent
后跟任意数量的非CRLF字符,然后是冒号,然后是空格。
user-agent[^\r\n]*:
至少一个非CRLF字符作为一个组。
([^\r\n]+)
至少一个CRLF角色。
[\r\n]+
文字disallow
后跟任意数量的非CRLF字符,然后是冒号,然后是空格。
disallow[^\r\n]*:
至少非CRLF字符作为一个组。
([^\r\n]+)
至少一个CRLF角色。 [\ r \ n]的+
SingleLine
选项意味着“将输入视为单行。”