15

私は2 つの単語の間にスペースを追加することから質問を進めています。

要件: キャメル ケース文字列を分割し、大文字の直前にスペースを置き、その後に小文字が続くか、何もない場合があります。大文字の間にスペースを入れてはいけません。

例:CSVFilesAreCoolButTXTこの方法で生成したい文字列ですCSV Files Are Cool But TXT

私はこのように普通の急行を運転しました:

"LightPurple".replace(/([a-z])([A-Z])/, '$1 $2')

単語が 2 つ以上ある場合は、g フラグを使用してすべての単語に一致させる必要があります。

"LightPurpleCar".replace(/([a-z])([A-Z])/g, '$1 $2')

そのような単語を分割しようとしている場合は、CSVFile代わりにこの正規表現を使用する必要があるかもしれません:

"CSVFilesAreCool".replace(/([a-zA-Z])([A-Z])([a-z])/g, '$1 $2$3')

しかし、それでも私が要求した方法では機能しません。

4

5 に答える 5

25
var rex = /([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g;

"CSVFilesAreCoolButTXT".replace( rex, '$1$4 $2$3$5' );
// "CSV Files Are Cool But TXT"

また、

"CSVFilesAreCoolButTXTRules".replace( rex, '$1$4 $2$3$5' );    
// "CSV Files Are Cool But TXT Rules"

正規表現パターンに一致するサブジェクト文字列のテキストは、置換文字列に置き換えられます'$1$4 $2$3$5'。ここで$1$2などは、パターンのキャプチャ グループに一致する部分文字列を参照します()

$1最初のサブパターンに一致した([A-Z])部分$3文字列を参照し、最初のサブパターンに一致した部分文字列を参照し([a-z])ます。

代替文字のため|、正規表現を一致させるには、([A-Z])([A-Z])([a-z])サブパターンまたは([a-z])([A-Z])サブパターンのいずれかと一致する必要があります。したがって、一致が行われた場合、キャプチャ グループのいくつかは一致しないままになります。これらのキャプチャ グループは、置換文字列で参照できますが、置換文字列には何の影響もありません。事実上、空の文字列を参照します。

置換文字列のスペースにより、一致が行われるたびにサブジェクト文字列にスペースが挿入されます (末尾のgフラグは、正規表現エンジンが複数の一致を検索することを意味します)。

于 2013-03-12T19:49:06.297 に答える