让正则表达式匹配过去行结尾

问题描述:

我想构建一个正则表达式来帮助我分析大量的robots.txt文件。我正在尝试查找特定的用户代理是否被禁止。让正则表达式匹配过去行结尾

文件大致如下他,但可能会略有不同与whitepace:

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.*:(.*$) 

随着多和忽略大小写设置选项。

这对我的需求的用户代理部分很好,但现在我需要匹配任何dissallow单词,在另一个user-agent宣布之前。我试过匹配$\r\n,但我不知道如何让比赛继续在$之后。我之后添加的任何图案似乎都不起作用。例如:

user-agent.*:(.*$)(^.*disallow) 

我想匹配换行符,然后拒绝,但它不匹配。另外我不确定如何在user-agent之前终止比赛,并且仍然在最后的宣告规则上工作。

任何人都可以指向正确的方向吗?

+0

不知道你是什么之后,但见(http://regexstorm.net/tester?p=user -agent。*%3A%28 *%29%28%5 CN。*不允许%29&I =用户代理%3A + *%0D%0aDisallow%3A +%2fnext%2F%0D%0A%0D%0aUser剂%3A + *%0D%0aDisallow%3A +%2fmshots%2fv1%2F&O = I)。只是'$'不符合换行符,它只匹配'\ n'之前的位置。 –

+0

在JavaScript中,正则表达式最后需要'/ gmi'作为多个。多行和不区分大小写的匹配。不太清楚c#。见[this](https://regex101.com/r/7AcZh8/1/) – Nisarg

+0

啊,谢谢,我正在尝试其中一个。有时在用户代理和禁止之间有空行。我有一个玩你的演示,但无法弄清楚,是否有符合任何字符和任何行尾的符号?在C# – Guerrilla

您可以使用

(?i)user-agent.*:(.*)([\r\n]\s*.*disallow) 

regex demo。这里您不需要RegexOptions.Multiline选项,因为不需要使用^$,这需要重新定义它们的行为。

详细

  • (?i) - 不区分大小写修改
  • user-agent - 文字串
  • .* - 任何0+字符不是一个换行符以外,尽可能多的
  • : - 一个冒号
  • (.*) - 第1组:任何0+字符其他ER比换行到行
  • ([\r\n]\s*.*disallow)的端部 - 组2:
    • [\r\n]\s* - 换行符炭(CR或LF),然后0+空格
    • .* - 以外的任何字符0+除换行符,尽可能多的
    • disallow - 一个子
+0

尝试极好!这很好用 – Guerrilla

+0

'user-agent。*:(。*)([\ r?\ n] \ s *。* disallow)'也可以用于linux行尾? – Guerrilla

+0

@Guerrilla从'[\ r?\ n]'中删除'?''。 '[\ r?\ n]'模式匹配CR,'?'或LF。只需'[\ r \ n] \ s *'就够了。任何换行符都以'\ r'或'\ n'开始,因此'[\ r \ n]'将匹配它的起始部分(在Windows中,CRLF是换行符)或整个换行符(在Unix/Linux,LF,在MacOS早期版本中,CR)和'\ s *'将匹配剩下的剩余空白。 –

您的问题似乎是,你不匹配User-agent: *Disallow之间的换行符。

像这样的正则表达式应该工作:/^user-agent: (.*)$[\s]^disallow: (.*)$/igm

此正则表达式将捕获的User-agent的价值和Disallow的价值,并会与任何类型的换行的工作。 的igm标志的意思是区分 nsensitive,叶形和中号 ultiline

可以使用regexr测试。

可以使用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字符,随后GY一个冒号,然后空间。 user-agent[^\r\n]*:

至少有一个非CRLF字符作为一个组。 ([^\r\n]+)

至少一个CRLF字符。 [\r\n]+

甲字面disallow后跟任意数量的非CRLF字符,随后GY一个冒号,然后一个空间。 disallow[^\r\n]*:

至少非CRLF字符为一组。 ([^\r\n]+)

至少一个CRLF字符。 [\ r \ n] +

SingleLine选项表示“将输入视为单行”。 [了`用户代理*:(*)(。\ n *不允许)`正则表达式演示]