0

我需要一个正则表达式,它将选择从行首到第一个左方括号的所有内容。在下面的示例中,它将匹配Lorem、 consectetur - adipisicing和labore et

Lorem [ipsum] dolor sit amet,

consectetur-adipisicing [elit] sed do 

eiusmod tempor incididunt ut

labore et [dolore] magna aliqua.

感谢您的帮助。

4

5 回答 5

2

当一个简单的锚和否定字符类可以解决问题时,为什么人们会使用点和复杂的环视结构?

(?m)^[^\[\r\n]+(?=\[)

如果您的正则表达式支持它,您可以通过使量词所有格来进一步优化此正则表达式:

(?m)^[^\[\r\n]++(?=\[)

如果您的正则表达式风格不支持前瞻,请[在匹配中包含 并使用捕获组来获取您想要的部分:

(?m)^([^\[\r\n]+)\[

如果您的正则表达式风格不支持模式修饰符(?m),只需打开选项以^在正则表达式之外的换行符(“多行模式”)处进行匹配。

于 2013-07-16T13:59:37.413 回答
2

使用后视和前瞻:

(?<=^|\n)(.*?)(?=\s?\[)

解释:

(?<=...)是肯定的后视,检查前面的字符是否匹配。

^|\n旨在成为行首。文本开头 ( ^) 或换行符 ( \n)。

.是任何字符。

.*?是零个或多个任意字符。*?而不*是非贪婪匹配,因此它将匹配第一个而不是最后一个括号。

(?=...)是积极的前瞻,检查下一个字符是否匹配。

\s是空白,?使其成为可选(这是为了防止 之前的空格[也匹配)。

\[是转义的[(它需要转义,因为[有不同的含义)

于 2013-04-24T09:49:24.973 回答
1

try"[^\[]*" []表示字符集,表示^\[除重复任意次数之外的任何内容。如此结合,这应该是你的答案[*

于 2013-04-24T09:44:19.093 回答
0

我想说最简单的版本是:

(.*?)\[.*

于 2013-04-24T09:41:17.663 回答
0

这可能会有所帮助..

^(.*)\[

简单示例:

my $str ="consectetur-adipisicing [elit] sed do";
my $tmp;
if ($str =~ m/^(.*)\[/) {
    $tmp = $1;
}
print "String upto [: $tmp\n";

输出是:

String upto [: consectetur-adipisicing
于 2013-04-24T09:52:04.283 回答