我需要一个正则表达式,它将从行的开头到第一个左方括号选择所有内容。在下面的示例中,它将匹配 Lorem , consectetur-adipisicing 和 labore et
Lorem [ipsum] dolor sit amet,
consectetur-adipisicing [elit] sed do
eiusmod tempor incididunt ut
labore et [dolore] magna aliqua.
感谢您的帮助。
答案 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