以下是我的正则表达式版本:
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上工作?
谢谢。
答案 0 :(得分:1)
你几乎得到了它 - 只是错过了量词非贪婪(或不情愿):
.*/([^/]+?)(?:\.(.*))?$
因此,只需对OP的第2版进行一次修改,该模式即可运行。只需在?
量词之后添加+
即可使其变得非贪婪,即([^/]+?)
而不是([^/]+)
。对于第一个测试字符串,这可以确保非贪婪部分仅匹配点.
之前的文本,因为.
即(?:\.(.*))?
测试字符串:
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\/([^\.]*)