使用正向前瞻来移除字符串的中间部分

时间:2013-07-19 14:46:19

标签: regex

我目前正在尝试删除此字符串中间的文字:

RenameMe_12345_12365_130706T234502.txt

使用以下正则表达式:

^[a-zA-Z]+(?=_[0-9]+_[0-9]+).+$

试图返回:

RenameMe_130706T234502.txt

但正则表达式返回整个字符串而不排除中间:

RenameMe_12345_12365_130706T234502.txt

我是否错误地使用了正面预测,或者我是否错误地接近了问题?可以通过这种方式使用积极的预测吗?

3 个答案:

答案 0 :(得分:4)

替换此正则表达式:

_.*_

_

使用sed工具的示例:

kent$  echo RenameMe_12345_12365_130706T234502.txt|sed 's/_.*_/_/'
RenameMe_130706T234502.txt

您可以使用自己的工具/编程语言来完成。

OP的评论

编辑

@CodingUnderDuress _.*_是一个正则表达式(BRE)。它使用.*贪婪的角色来实现您的目标。

如果您不想进行替换,只需使用正则表达式匹配您需要的部分,您就可以:

(^[^_]*|_[^_]*$)

用grep测试:( - E表示ERE)

kent$  echo "RenameMe_12345_12365_130706T234502.txt"|grep -Eo '(^[^_]*|_[^_]*$)' 
RenameMe
_130706T234502.txt

如果你真的喜欢它们,你当然可以使用look-behind / ahead。那你需要PCRE。而且我不明白为什么我们需要在这里使用环顾四周来满足您的需求。

答案 1 :(得分:0)

您可以用空字符

替换此内容
_(\w+(?=_))*

工作

[1] Match the character `_`
[2] followed a set of word characters
[3] I have used positive look-ahead `?=_` to make sure the last `_` is not missed out
[4] Match the above 0 or more times

答案 2 :(得分:0)

使用此

(?<=[^_])_\w+_(?=[^_]+)

匹配您要删除的部分。