使正则表达式匹配过去的行结束

时间:2017-10-04 12:46:04

标签: c# regex

我正在尝试构建一个正则表达式来帮助我解析大量的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之前终止匹配,并且仍然可以使用最后一个声明规则。

有人能指出我正确的方向吗?

3 个答案:

答案 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选项意味着“将输入视为单行。”