正则表达式替换没有可用的全局修饰符

时间:2017-02-24 09:29:24

标签: regex

我正在使用内置正则表达式实现的软件,它不支持全局修饰符,所以我必须让它在没有/ g的情况下工作

我的测试字符串是(部分的数量可以是无限的:

AAA%2dbbb%2dccc%2dddd%2deee

我希望它是:aaa-bbb-ccc-ddd-eee

通常我会写(%2d)和g标志并用 -

替换

我设法写这个以匹配无限次出现次数

(\ w)的((%2D)(\ W +))+

但我有替换规则的问题,因为我的组2有2个子组,我找不到如何处理它们,

任何人都可以帮助替换规则吗?

2 个答案:

答案 0 :(得分:0)

由于评论最终得出了我在发布问题之前得出的相同结论,我决定发布答案以便很好地结束问题(而不是删除问题,因为即使是否定答案也是答案,可能会节省一个小时或更长时间的研究(实际发生在我身上))。一般的结论是 - 用正则表达式来解决这个问题是不可能的。我在这里引用@ltux的两条最佳评论:

  

一次性使用正则表达式无法解决此问题。如果捕获组与+等量词一起使用,则捕获组的内容将始终是找到的最后一个匹配。在您的情况下,第二个捕获组的内容将为%2deee,您无法获得%2dbbb,%2dccc等,因此您有机会替换它。 - ltux 2天前

     

正则表达式无法解决您的问题。您必须自己试图绕过软件的限制,除非您告诉我们您正在使用哪种软件。 - ltux 2天前

答案 1 :(得分:0)

创建一个包含您要处理的行类型的文件:

cat << EOF >> abcde.txt
aaa%2dbbb%2dccc%2dddd%2deee
EOF

使用您提到的全局替换作为您通常执行此类替换的方式,使用此sed片段如下所示。

sed -e "s#%2d#-#g" abcde.txt
aaa-bbb-ccc-ddd-eee

基本上,您不必考虑在空白字符周围出现的字符类型,而只关注白色空间本身。多次更换此字符将非常简单地解决您的问题。换句话说,不需要围绕与改变有关的角色进行模式匹配。这是我们许多人在处理正则表达式时遇到的常见问题。

基本上替换是这样的:找到第一个出现的空格'%2d',用连字符' - '替换它,并重复其余的字符串。