Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于捕获多行的正则表达式_Regex - Fatal编程技术网

Regex 用于捕获多行的正则表达式

Regex 用于捕获多行的正则表达式,regex,Regex,我有一些这样的文字: 注意:这是示例文本,因此内容不重要 猫坐在狗身上 理由:没有理由 担心:他很冷 因为:寒冷的天气 猫坐在老鼠身上 原因:他吃老鼠 担忧:他饿了 因为:开罐器坏了 猫坐在马上 理由:他想骑马 担心:他可能会掉下来 因为:马鞍太大了 我正在尝试编写一个正则表达式,它只能捕获“猫坐在鼠标上”部分,但是在捕获全文时遇到了问题 我试过: (\bCAT\sSAT\sON\sA\sMOUSE)(.*)\n{2} (\bCAT\sSAT\sON\sA\sMOUSE)(.*)\n{2} 这个

我有一些这样的文字:

注意:这是示例文本,因此内容不重要

猫坐在狗身上 理由:没有理由 担心:他很冷 因为:寒冷的天气 猫坐在老鼠身上 原因:他吃老鼠 担忧:他饿了 因为:开罐器坏了 猫坐在马上 理由:他想骑马 担心:他可能会掉下来 因为:马鞍太大了 我正在尝试编写一个正则表达式,它只能捕获“猫坐在鼠标上”部分,但是在捕获全文时遇到了问题

我试过:

(\bCAT\sSAT\sON\sA\sMOUSE)(.*)\n{2} (\bCAT\sSAT\sON\sA\sMOUSE)(.*)\n{2} 这个想法是匹配字符串的开始部分,然后捕获所有内容,直到两个换行符

{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