正则表达式以及如何包含匹配的字符串但排除以下划线结尾的匹配字符串?

时间:2013-11-07 14:07:30

标签: regex

我已经尝试了很多方法在perl / sed中解决这个问题并且读了很多关于负向前瞻等信息,但是匹配仍然不起作用。
我有这样的行: -

for (vector<some__header>::const_iterator header = some__header_->begin(); header != some__header_->end(); ++header)  

for (vector<some__trailer>::const_iterator header = some__trailer_->begin(); header != some__trailer_->end(); ++header)  

我想将某些__的文字替换为其他__,而不是任何与某些{{strong>匹配的文字1}}值_

所以,如果我要用第一行的其他取代某些,我会得到: -

__

显然,像(在perl中): -

for (vector<other__header>::const_iterator header = some__header_->begin(); header != some__header_->end(); ++header)  

不起作用,因为它也会匹配 some__heade 我缺少什么是魔法正则表达式?

3 个答案:

答案 0 :(得分:1)

你可以说:

sed 's/some__header[^_]/other__value/g' filename

此外,

sed 's/some__[^_]*[^_]/other__value/g' filename

如果some仅替换为other,请说:

sed 's/some__\([^_]*\)[^_]/other__\1/g' filename

答案 1 :(得分:1)

也可以捕获尾随的非下划线:

sed 's/some\(__[a-zA-Z]*[^a-zA-Z_]\)/other\2/g'

关键是否定的字符类不能只是[^_],因为它允许名称的最后一个字母为非下划线。

还要注意轻微的重新安排以简化事情

答案 2 :(得分:0)

使用和alphas的占有量词:

perl -pe 's/some(__(?>[[:alpha:]]*))(?!_)/other$1/g' infile

使用以下示例行:

for (vector<some__header>::const_iterator header = some__header_->begin(); header != some__header->end(); ++header)  some__header_

它产生:

for (vector<other__header>::const_iterator header = some__header_->begin(); header != other__header->end(); ++header)  some__header_