让正则表达式匹配过去行结尾
我想构建一个正则表达式来帮助我分析大量的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
之前终止比赛,并且仍然在最后的宣告规则上工作。
任何人都可以指向正确的方向吗?
您可以使用
(?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
- 一个子
-
尝试极好!这很好用 – Guerrilla
'user-agent。*:(。*)([\ r?\ n] \ s *。* disallow)'也可以用于linux行尾? – Guerrilla
@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 *不允许)`正则表达式演示]
不知道你是什么之后,但见(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'之前的位置。 –
在JavaScript中,正则表达式最后需要'/ gmi'作为多个。多行和不区分大小写的匹配。不太清楚c#。见[this](https://regex101.com/r/7AcZh8/1/) – Nisarg
啊,谢谢,我正在尝试其中一个。有时在用户代理和禁止之间有空行。我有一个玩你的演示,但无法弄清楚,是否有符合任何字符和任何行尾的符号?在C# – Guerrilla