Regex 用于捕获多行的正则表达式
我有一些这样的文字: 注意:这是示例文本,因此内容不重要 猫坐在狗身上 理由:没有理由 担心:他很冷 因为:寒冷的天气 猫坐在老鼠身上 原因:他吃老鼠 担忧:他饿了 因为:开罐器坏了 猫坐在马上 理由:他想骑马 担心:他可能会掉下来 因为:马鞍太大了 我正在尝试编写一个正则表达式,它只能捕获“猫坐在鼠标上”部分,但是在捕获全文时遇到了问题 我试过: (\bCAT\sSAT\sON\sA\sMOUSE)(.*)\n{2} (\bCAT\sSAT\sON\sA\sMOUSE)(.*)\n{2} 这个想法是匹配字符串的开始部分,然后捕获所有内容,直到两个换行符 {2} 就是捕捉两个换行符 我尝试了更多的变体,但我所能做的只是捕捉第一行Regex 用于捕获多行的正则表达式,regex,Regex,我有一些这样的文字: 注意:这是示例文本,因此内容不重要 猫坐在狗身上 理由:没有理由 担心:他很冷 因为:寒冷的天气 猫坐在老鼠身上 原因:他吃老鼠 担忧:他饿了 因为:开罐器坏了 猫坐在马上 理由:他想骑马 担心:他可能会掉下来 因为:马鞍太大了 我正在尝试编写一个正则表达式,它只能捕获“猫坐在鼠标上”部分,但是在捕获全文时遇到了问题 我试过: (\bCAT\sSAT\sON\sA\sMOUSE)(.*)\n{2} (\bCAT\sSAT\sON\sA\sMOUSE)(.*)\n{2} 这个
任何形式的帮助都将不胜感激。你要求任何东西,然后两次换行。 你需要两次要求换行 试试这个:
(\bCAT\sSAT\sON\sA\sMOUSE)(\n.*){2}
你用什么语言工作?那会有点帮助。在Perl中,可以添加
m
说明符,将多行字符串视为一段文本:
#! /usr/bin/perl
my $string =<<STRING;
CAT SAT ON A MOUSE
REASON: He eats mice
CONCERN: He was hungry
BECAUSE: Can opener didn't work
This is a test, and not part of the string to match.
STRING
if ($string =~ /(^(CAT[^\n]+).*\n\n/s) {
say "Match: $1";
}
else {
say "Didn't match";
}
#/usr/bin/perl
my$string=这可能有效:
(\bCAT[^\S\n]坐在[^\S\n]一只[^\S\n]鼠标上[^\S\n]*?)\n{2}
或
(\bCAT[^\S\n]+SAT[^\S\n]+ON[^\S\n]+A[^\S\n]+MOUSE\b[\S\S]*?)\n{2}
编辑-正则表达式必须在第一个锚点之后减速,否则下一个锚点
可能会因为速度而被忽略。这可以使用非贪婪量词来完成
或前瞻性断言(允许以检查为代价的攻击行为
这基本上抵消了它的速度)
Edit2-有时可能需要匹配段落之间的“明显”空白,其中可能包括非换行空格
例如,\n\n
将不匹配这样的明显间隙:
“开始\段落的nend \n\n'应在何时显示
在这种情况下,将\n{2}
替换为\n[^\S\n]*\n
将允许它匹配。
此外,由于使用了非贪婪量词(在本例中)\b[\s\s]*?
,
当段落位于或接近文件末尾时,可以解释并匹配段落末尾。综上所述,YELDS:
/(\bCAT\s+SAT\s+ON\s+A\s+MOUSE\b[\s\s]*?)($| \n[^\s\n]*\n)/
现在看起来相当复杂,但完成了全部工作。我认为您的主要问题是,您的文本使用\r\n
分隔行,而您只查找\n
。试试这个:
/^(CAT +SAT +ON +A +MOUSE)(?:(?:\r\n|[\r\n])[^\r\n]+)*/m
(?:\r\n |[\r\n])
匹配三个最常见的行分隔符(我称之为换行符):\r\n
、\r
或\n
。它一次只匹配一条新行,不管它是哪一种。然后,[^\r\n]+
接管,因此每行只能有一个行分隔符。由于段落由两个新行分隔,因此匹配到此结束
我在多行模式(m
)下使用起始锚点(^
)自由地锚定了第一行。这样做不是绝对必要的,但可以帮助正则表达式更快地找到匹配项,更重要的是,在不可能匹配时更快地失败
(你还没有说你使用的是哪种正则表达式风格,所以我做了一个粗略的猜测,并使用了JavaScript语法。)可能想看看正则表达式的多行标志?什么正则表达式,什么编辑器/语言?试试这个怎么样:它在dotall模式下运行良好-在@Carl Norum测试-如果“.”包含换行符,该正则表达式将查找到最后一个\n\n
之前的所有内容。所以,真的不起作用。锚是“CAT SAT”和“工作\n\n”。您的正则表达式将获取其间的所有内容,包括碰巧在其中的其他“工作”。离他想做的事情很远。我现在明白了。我被他说的话弄糊涂了,“这个想法是匹配字符串的开头部分,然后捕获所有内容,直到两个换行符。”我将修改我的程序。大卫·W-不过,我想他是想在第一个双换行符处停下来。因此,/.*\n\n/s
将匹配“最后一个”双换行符之前的所有内容,包括中间的两个或多个连续换行符。谢谢。我正在使用javascript regexp。此正则表达式将匹配“CAT坐在鼠标上\n但\n这将匹配“CAT坐在鼠标上\n但\n这将匹配”\n高亮度部分。谢谢您的回答。当我真的想要捕获所有内容直到两行中断时,这可以拾取两行。考虑到[^\r\n]+
是贪婪的,这似乎是一种快速的方法。尝试了这个常规的Expression Pal(在线工具)但没有用。。我遗漏了什么吗?你说的是regexpal.com吗?那个网站似乎不适合我,至少在FireFox中是这样。但它在铬合金中工作良好。或者尝试其他测试程序,例如。我尝试了这个正则表达式pal(在线正则表达式检查器),但它不起作用。。
/^(CAT +SAT +ON +A +MOUSE)(?:(?:\r\n|[\r\n])[^\r\n]+)*/m