正则表达式:如何在其他捕获字符之前匹配字符?

时间:2018-05-02 03:11:19

标签: regex regex-lookarounds

我正在尝试匹配一个字符串列表,我想确保第一个字符不是等号,不要捕获那个匹配。所以,对于一个列表(摘自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

所以问题是:如何匹配但不能在正则表达式的其余部分之前捕获字符串?

3 个答案:

答案 0 :(得分:0)

背后的负面看法是:

(?<!=)==[0-9.]+

此外,这是我喜欢使用的网站:

http://www.rubular.com/

当然,如果您建议使用哪种引擎/软件,它会帮助我们知道可能存在哪些限制。

答案 1 :(得分:0)

如果您要从文本中删除版本号,则可以捕获第一个捕获组中的等号if (!Schema::hasTable('stores')) { Schema::create('stores', function (Blueprint $table) { $table->increments('id'); ... }); } ,然后匹配([^=])和版本号==。然后在替换中你将使用你的捕获组。

<强>正则表达式

([^=])==\d+(?:\.\d+)+

<强>替换

第1组\d+(?:\.\d+)+

注意

您还可以使用$1==[0-9]+.*来匹配双等号和版本号,但这将是一个非常广泛的匹配。第一个也匹配==[0-9.]+,后者也匹配====1test

答案 2 :(得分:-1)

还有一个名为'lookbehind assertion'的正则表达式运算符(也称为正向后看)?<= - 在上面的示例中,在表达式(?<=[^=])==[0-9]+.*中使用它会产生预期的输出:

==3.10
==4.0.0
==0.5.1

在撰写本文时,我花了一段时间才发现这一点 - 特别是流行的正则表达式工具regexr目前不支持lookbehind断言。

如果有替代方法可以使用lookbehind来解决,我很乐意听到它。

enter image description here