我正在尝试匹配一个字符串列表,我想确保第一个字符不是等号,不要捕获那个匹配。所以,对于一个列表(摘自pip冻结),如:
ply==3.10
powerline-status===2.6.dev9999-git.b-e52754d5c5c6a82238b43a5687a5c4c647c9ebc1-
psutil==4.0.0
ptyprocess==0.5.1
我希望捕获的输出看起来像这样:
==3.10
==4.0.0
==0.5.1
我首先想到使用否定前瞻(?![^=])
会有效,但是使用正则表达式(?![^=])==[0-9]+.*
它最终会捕获我不想要的行:
==3.10
==2.6.dev9999-git.b-e52754d5c5c6a82238b43a5687a5c4c647c9ebc1-
==4.0.0
==0.5.1
我还尝试使用非捕获组(?:[^=])
,其正则表达式为(?:[^=])==[0-9]+.*
但最终捕获了我不想要的第一个字符:
y==3.10
l==4.0.0
s==0.5.1
所以问题是:如何匹配但不能在正则表达式的其余部分之前捕获字符串?
答案 0 :(得分:0)
背后的负面看法是:
(?<!=)==[0-9.]+
此外,这是我喜欢使用的网站:
当然,如果您建议使用哪种引擎/软件,它会帮助我们知道可能存在哪些限制。
答案 1 :(得分:0)
如果您要从文本中删除版本号,则可以捕获第一个捕获组中的等号if (!Schema::hasTable('stores')) {
Schema::create('stores', function (Blueprint $table) {
$table->increments('id');
...
});
}
,然后匹配([^=])
和版本号==
。然后在替换中你将使用你的捕获组。
<强>正则表达式强>
<强>替换强>
第1组\d+(?:\.\d+)+
注意强>
您还可以使用$1
或==[0-9]+.*
来匹配双等号和版本号,但这将是一个非常广泛的匹配。第一个也匹配==[0-9.]+
,后者也匹配====1test
答案 2 :(得分:-1)