0

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

RenameMe_12345_12365_130706T234502.txt

使用以下正则表达式:

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

试图返回:

RenameMe_130706T234502.txt

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

RenameMe_12345_12365_130706T234502.txt

我是否错误地使用了积极的前瞻,或者我是否错误地解决了问题?不能以这种方式使用积极的前瞻吗?

4

3 回答 3

5

替换这个正则表达式:

_.*_

_

工具示例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

如果你真的喜欢它们,你当然可以使用后视/前瞻。那么你需要PCRE。而且我不明白为什么我们需要在这里使用环视来满足您的要求。

于 2013-07-19T14:51:58.470 回答
0

您可以用空字符替换 this 的内容

_(\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
于 2013-07-19T14:54:09.947 回答
0

用这个

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

以匹配您要删除的部分。

于 2013-07-19T14:55:54.527 回答