我需要一个正则表达式,它将选择从行首到第一个左方括号的所有内容。在下面的示例中,它将匹配Lorem、 consectetur - adipisicing和labore et
Lorem [ipsum] dolor sit amet,
consectetur-adipisicing [elit] sed do
eiusmod tempor incididunt ut
labore et [dolore] magna aliqua.
感谢您的帮助。
我需要一个正则表达式,它将选择从行首到第一个左方括号的所有内容。在下面的示例中,它将匹配Lorem、 consectetur - adipisicing和labore et
Lorem [ipsum] dolor sit amet,
consectetur-adipisicing [elit] sed do
eiusmod tempor incididunt ut
labore et [dolore] magna aliqua.
感谢您的帮助。
当一个简单的锚和否定字符类可以解决问题时,为什么人们会使用点和复杂的环视结构?
(?m)^[^\[\r\n]+(?=\[)
如果您的正则表达式支持它,您可以通过使量词所有格来进一步优化此正则表达式:
(?m)^[^\[\r\n]++(?=\[)
如果您的正则表达式风格不支持前瞻,请[
在匹配中包含 并使用捕获组来获取您想要的部分:
(?m)^([^\[\r\n]+)\[
如果您的正则表达式风格不支持模式修饰符(?m)
,只需打开选项以^
在正则表达式之外的换行符(“多行模式”)处进行匹配。
使用后视和前瞻:
(?<=^|\n)(.*?)(?=\s?\[)
解释:
(?<=...)
是肯定的后视,检查前面的字符是否匹配。
^|\n
旨在成为行首。文本开头 ( ^
) 或换行符 ( \n
)。
.
是任何字符。
.*?
是零个或多个任意字符。*?
而不*
是非贪婪匹配,因此它将匹配第一个而不是最后一个括号。
(?=...)
是积极的前瞻,检查下一个字符是否匹配。
\s
是空白,?
使其成为可选(这是为了防止 之前的空格[
也匹配)。
\[
是转义的[
(它需要转义,因为[
有不同的含义)
try"[^\[]*"
[]
表示字符集,表示^\[
除重复任意次数之外的任何内容。如此结合,这应该是你的答案[
*
我想说最简单的版本是:
(.*?)\[.*
这可能会有所帮助..
^(.*)\[
简单示例:
my $str ="consectetur-adipisicing [elit] sed do";
my $tmp;
if ($str =~ m/^(.*)\[/) {
$tmp = $1;
}
print "String upto [: $tmp\n";
输出是:
String upto [: consectetur-adipisicing