正则表达式替换camelWords中的单词

正则表达式替换camelWords中的单词

我想替换camelWords中的一个单词,例如:将文本中的“foo”替换为“bar”:

ifootest // not replace this foo
Ifootest // not replace this foo
IfooTest // << replace this foo
I foo Test // << replace this foo
I_foo_Test // << replace this foo

或者将文本中的“Foo”替换为“Bar”:

IFootest // not replace
IFooTest // not replace
iFooTest // replace
i Foo Test //replace
I_Foo_Test // replace

规则是:如果我输入一个单词。

单词第一个字符之前的字符不应与单词第一个字符的大小写相同。

单词最后一个字符后面的字符不应与单词最后一个字符的大小写相同。

答案1

你可以这样做:

perl -pe 's/(?<![[:lower:]])foo(?![[:lower:]])/bar/g'

foo即使用负向后查找和向前查找运算符替换前面或后面都没有小写字母的实例。

这只适用于 ASCII 文本。使用您的语言环境的字符集,您可以添加一个-Mopen=locale选项。或者用于-C处理 UTF-8 文本。

这需要针对像Foo/ foO/这样的单词进行调整FoO,其中第一个或最后一个字符是大写字母。

要使其适用于任意单词,您可以执行以下操作:

WORD=FoO REPL=bar perl  -pe 's{
  (?(?=[[:lower:]])      # if following character is lowercase
      (?<![[:lower:]])|  # preceding must not be lower 
      (?<![[:upper:]])   # otherwise preceding must not be upper
  ) \Q$ENV{WORD}\E
  (?(?<=[[:lower:]])     # if preceding character is lowercase
      (?![[:lower:]])|   # following must not be lower 
      (?![[:upper:]])    # otherwise following must not be upper
  )}{$ENV{REPL}}gx'

答案2

这可能比 慢大约 1,000,000 倍,perl但这里有一个awk版本只是为了挑战它。但不管怎么说

awk -v gzin="Foo" -v gzout="Bar" '
  BEGIN {FS=gzin;
    cb=(substr(gzin,1,1)~/[a-z]/)?"[a-z]$":"[A-Z]$"
    ca=(substr(gzin,length(gzin)-1,1)~/[a-z]/)?"^[a-z]":"^[A-Z]"
  }
  {printf $1; for (f=2; f<=NF; f++) printf ("%s%s", ((($(f-1) ~ cb) || ( $(f) ~ ca ))?gzin:gzout), $f) ; 
  print ""}' file

甚至还和评论相符

ifootest // not replace this foo
Ifootest // not replace this foo
IbarTest // << replace this bar
I bar Test // << replace this bar
I_bar_Test // << replace this bar

-v gzin="Foo" -v gzout="Bar"

IFootest // not replace
IFooTest // not replace
iBarTest // replace
i Bar Test //replace
I_Bar_Test // replace        

演练

awk -v gzin="Foo" -v gzout="Bar" '

将匹配gzin和替换加载gzout为变量

  BEGIN {FS=gzin;

分裂于gzin

    cb=(substr(gzin,1,1)~/[a-z]/)?"[a-z]$":"[A-Z]$"

测试第一个字符的大小写gzin并设置正则表达式来匹配它

    ca=(substr(gzin,length(gzin)-1,1)~/[a-z]/)?"^[a-z]":"^[A-Z]"

同上最后一个字符

  }
  {printf $1; for (f=2; f<=NF; f++) printf ("%s%s", ((($(f-1) ~ cb) || ( $(f) ~ ca ))?gzin:gzout), $f) ; 

迭代测试先前字段和当前字段的字段,并在它们之间放置适当的值

  print ""}' file

结束每一行

聚苯乙烯我想我伤了我的大脑

相关内容