32

ImageWideNiceまたはなどの素敵なキャメルケース文字列がありますImageNarrowUglyImageここで、その文字列を、WideまたはNarrow、およびNiceまたはなどの部分文字列で分割したいと考えていますUgly

これは簡単に解決できると思いました

camelCaseString =~ /(Image)((Wide)|(Narrow))((Nice)|(Ugly))/

$1しかし奇妙なことに、これはとのみを満たしますが、 は満たし$2ません$3

その文字列を分割するためのより良いアイデアはありますか?

4

7 に答える 7

62
s = 'nowIsTheTime'

s.split /(?=[A-Z])/

=> ["now", "Is", "The", "Time"]

?=patternポジティブな先読みの例です。基本的に、パターン の直前の文字列内のポイントに一致します。 文字は消費されません。つまり、一致の一部としてパターンは含まれません。もう一つの例:

    irb> 'streets'.sub /t(?=s)/, '-'
=> "stree-s"

この場合、sは一致しますが (2 番目のt一致のみ)、置き換えられません。@Bryceと彼のregexp doc リンクに感謝します。ブライス・アンダーソンは次のように説明しています。

一致グループの先頭にある は、正の先読みと呼ばれます?=これは、正規表現が一致するかどうかを判断する際に文字を調べている間、それらを一致の一部にしていないことを示す方法です。通常、中間の文字を食べますが、この場合、一致自体が空であるため、[そこに]何もありません。()split()

于 2010-10-22T14:03:43.823 に答える
32

私はこれが古いことを知っていますが、これを探しているかもしれない他の人のために言及する価値があります。レールでは、これを行うことができます: "NowIsTheTime".underscore.humanize

于 2011-11-15T21:26:36.003 に答える
12

DigitalRoss の回答は、厳密なキャメル ケース (最初の文字が小文字) かパスカル ケース (最初の文字が大文字) かがわからない一般的なケースを処理するため、正しいです。

文字列がこれらの形式のいずれかを知っている場合、またはいずれかを強制したい場合は、Inflector を使用して実行できます。

パスカルの場合:

"NowIsTheTime".titleize

キャメルケースの場合:

"nowIsTheTime".titleize.camelize :lower
于 2014-08-31T15:47:12.280 に答える
2

イベントこれはRubyの正規表現の質問であり、DigitalRossによる回答は正しく、その単純さに輝いていますが、Javaの回答を追加したいと思います。

// this regex doesn't work perfect with Java and other regex engines
"NowIsTheTime".split("(?=[A-Z])"); // ["", "Now", "Is", "The", "Time"]

// this regex works with first uppercase or lowercase characters
"NowIsTheTime".split("(?!(^|[a-z]|$))"); // ["Now", "Is", "The", "Time"]
"nowIsTheTime".split("(?!(^|[a-z]|$))"); // ["now", "Is", "The", "Time"]
于 2010-10-22T14:50:56.613 に答える
2

やってみました

camelCaseString =~ /(Image)(Wide|Narrow)(Nice|Ugly)/

?

于 2010-10-22T14:05:17.140 に答える