从行的开头选择所有直到左方括号

时间:2013-04-24 09:38:03

标签: regex regexbuddy

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

Lorem [ipsum] dolor sit amet,

consectetur-adipisicing [elit] sed do 

eiusmod tempor incididunt ut

labore et [dolore] magna aliqua.

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

使用后视和前瞻:

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

<强>解释

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

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

.是任何角色。

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

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

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

\[是转发的[(由于[具有不同的含义,因此需要进行转义)

答案 1 :(得分:2)

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

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

如果你的正则表达式支持它,你可以通过使量词占有性来进一步优化这个正则表达式:

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

如果您的正则表达式不支持预测,请在匹配项中包含[并使用捕获组来获取所需的部分:

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

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

答案 2 :(得分:1)

尝试"[^\[]*" []表示字符集,^\[表示除[*以外的任何内容都会重复多次。如此组合,应该是你的答案

答案 3 :(得分:0)

我想说最简单的版本是:

(.*?)\[.*

答案 4 :(得分:0)

这可能会有所帮助..

^(.*)\[

简单示例:

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

输出为:

String upto [: consectetur-adipisicing