web-dev-qa-db-ja.com

camelWordsの正規表現をWordに置き換える

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

ルールは、私が言葉を入力した場合です。

単語の最初の文字の前の文字は、単語の最初の文字の大文字小文字と同じであってはなりません。

単語の最後の文字の後の文字は、単語の最後の文字の大文字小文字と同じであってはなりません。

2
John Chen

あなたは次のようなことをすることができます:

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'
1

これはおそらくPerlよりも約1,000,000倍遅いですが、ここでは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

各行を終了

[〜#〜] ps [〜#〜]脳を痛めたと思います

0
bu5hman