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。または-CUTF-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

各行の終わり

ポリスチレン私は脳を傷つけたようです。

関連情報