首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegEx -替换除第一次匹配之外的所有

RegEx -替换除第一次匹配之外的所有
EN

Stack Overflow用户
提问于 2012-09-16 23:08:54
回答 3查看 4K关注 0票数 0

如何在一个用于字符串的替换函数中使用RegEx来匹配一个子字符串的所有实例(除了第一个实例)?

例如,如果我要替换所有'a‘,除了第一个和我的字符串是:

代码语言:javascript
复制
a b a c b a a b

我想要:

代码语言:javascript
复制
a b c b b

我的实际用例是,我正在使用Ant构建一个项目,它将一堆.js文件连接在一起。每个javascript文件都以“使用严格”开头。我只想要这个声明一次,因此我希望删除该子字符串的所有实例,但开头的实例除外。

EN

回答 3

Stack Overflow用户

发布于 2012-09-17 14:11:08

下面是一个通用正则表达式:

代码语言:javascript
复制
echo "a b a c b a a b" | perl -pWe 's/(?<=(a))(.*?)\1/$2/g'

它使用lookbehind来检查匹配的模式是否位于字符串的第一位。(基本上,我想到的是s/(?<=(a).*?)\1//g,但可变长度的查找似乎没有得到广泛的实现)。有一个缺点--它将产生类似于

代码语言:javascript
复制
a b  c b   b

要使它整洁,你可以用

代码语言:javascript
复制
echo "a b a c b a a b" | perl -pWe 's/(?<=(a\s))(.*?)\1/$2/g'

但它不会像a b a c b a a那样删除输入中的最后一个a b a c b a a

票数 1
EN

Stack Overflow用户

发布于 2012-09-16 23:37:15

只需删除所有出现的"use strict";,然后在开始时添加一个。

编辑:示例:

  1. sed‘/“使用严格”;/d’< infile >外文件 变成了 (echo‘“使用严格”;sed’/“使用严格”;/d‘)< infile >外文件
  2. perl -nie 'print除非/“使用严格”;/;‘文件 变成了 perl -nie 'BEGIN {打印qq“使用严格”;\n;}打印除非/“使用严格”;/;‘文件
票数 0
EN

Stack Overflow用户

发布于 2012-09-16 23:41:18

要解决您的示例,可以使用负面的前瞻性断言:

代码语言:javascript
复制
echo "a b a c b a a b" | perl -pe 's/(?!^)a //g'

结果:

代码语言:javascript
复制
a b c b b

为了解决您的项目问题(假设use strict不会多次出现在级联文件中的每一行上),可以使用GNU sed删除除第一次以外的每一次事件:

代码语言:javascript
复制
sed '0,/$/!s/use strict//g' file.txt 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12451470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档