正则表达式:仅匹配模式的第一个实例

时间:2019-06-20 20:10:35

标签: regex sed

使用正则表达式表示字符串,我们需要删除行中第四个数字的第一个实例之前的所有文本。我们有一个正则表达式,可以“起作用”:

^((?!\d{4}\w).)*

给出以下字符串: foo-bar-spring_06-2006_02_25.rm 所需的输出是: 2006_02_25.rm

有效-如果只有一个四位数模式的实例。字符串: batt-fall_01-2001-11-10_0200-0400.rm产生以下结果:0400.rm

它应该产生: 2001-11-10_0200-0400.rm

注意:长话短说,但我们不能使用-或_作为分隔符。

我觉得我们接近了。有人有建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在延迟重复.之后使用正向超前模式:

^.*?(?=\d{4})

演示:https://regex101.com/r/8DZDQp/1

或者,您可以将4位数字分组:

^.*?(\d{4})

并用第一组$1代替比赛。

演示:https://regex101.com/r/8DZDQp/3

答案 1 :(得分:0)

一个可能更快的选择是忽略开始和不需要的部分,而不使用环视,并且使用类似于以下内容的简单表达式:

(\d{4}.*\..+)$

或:

(\d{4}.*\.[a-z]+)$

结束$锚也是不必要的,没有锚,它将仍然有效。

Demo