无法获得正则表达式

时间:2017-05-30 23:09:49

标签: regex

以下是我的正则表达式版本:

Version 1: .*/([^/]+)(?:\.(.*))$
Version 2: .*/([^/]+)(?:\.(.*))?$

我的替换是

 /$1/

我的测试字符串是:

Test 1: /features-past/nov-dec-2015/living-with-zill.html?wxY
Test 2: /features-past/nov-dec-2015/livig-with-zill

预期输出为:

/living-with-zill/

版本1适用于测试1,但不适用于测试2(不匹配)

版本2适用于测试2,但不适用于测试1(不匹配)

我认为0或1正则表达式(?)会匹配两者。如何重写这个以使版本1或2在测试1和2上工作?

谢谢。

3 个答案:

答案 0 :(得分:1)

你几乎得到了它 - 只是错过了量词非贪婪(或不情愿):

.*/([^/]+?)(?:\.(.*))?$

因此,只需对OP的第2版进行一次修改,该模式即可运行。只需在?量词之后添加+即可使其变得非贪婪,即([^/]+?)而不是([^/]+)。对于第一个测试字符串,这可以确保非贪婪部分仅匹配点.之前的文本,因为.(?:\.(.*))?

Regex101 Demo

测试字符串:

Test 1: /features-past/nov-dec-2015/living-with-zill.html?wxY
Test 2: /features-past/nov-dec-2015/livig-with-zill

输出(用$1替换后):

living-with-zill
livig-with-zill

答案 1 :(得分:1)

您可以将.添加到否定字符类并使用

.*/([^/.]+).*

请参阅regex demo

<强>详情:

  • .*/ - 匹配任意0个字符,直到最后/
  • ([^/.]+) - 捕获除/.以外的1个字符
  • .* - 匹配任何0+字符。

答案 2 :(得分:0)

这是我找到的最简单的方法:

\d\/([^\.]*)