2017-03-07 2 views
2

私は、キャメルケースにある単語ごとにStringを分割する必要がある場合があります。私は、このパターンを使用してanswer this questionに類似の分割処理を実現しています:私は、このテストセットに遭遇するまで希望の地域の単語を分割する

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

すべてが正常である:

  • SalaryGrade - 給与等級を
  • ParentChild - 親子
  • メンテナンス - メンテナンス
  • 送金SPD - 送金SPD
  • FBIAgent - FBIエージェント
  • FBIAgentNYDepartment - FBIエージェントNY部門罰金3つの作品まで

一つが、六から四は、それぞれ "送金SPD"、 "FBIエージェント"、 "FBIエージェントNY部門" でなければなりません。

連続する大文字を1単語として扱い、シーケンスの最後を次の単語の先頭として扱うようにリージョンを選択するにはどうすればよいですか?私は正直であるために一行のRegexが好きではなく、私はすべての希望を失っています。私はここでブルートフォース・ループを実行する予定です。

EDIT:このサイトでここで文字列を分割することについての他の質問とは異なり、大文字と大文字の両方の文字と大文字の文字の両方をこの機能で使用します。

+1

JSがlookbehindをサポートしていないか、/(?<= [az])(?= [AZ])/ 'で十分だったでしょうか? – Aaron

+2

' str.match(/ [AZ] +? ![az])| [AZ] [az] */g) ' –

+0

@Aaron私はちょうど何分も前に見張りをテストしました。だからこそ私はそれを繰り返すことを考えている。 – Gideon

答えて

2

あなたがここに一致アプローチを使用することがあります。

str.match(/[A-Z]+(?![a-z])|[A-Z][a-z]*/g) 

regex demo

詳細を参照してください。

  • [A-Z]+(?![a-z]) - 1+小文字のASCII文字
  • |と続かない大文字のASCII文字 - または
  • [A-Z][a-z]* - 大文字のASCII文字が0+小文字のASCII文字

var ss = ['SalaryGrade','ParentChild','Maintenance','RemittanceSPD','FBIAgent','FBIAgentNYDepartment']; 
 
var rx = /[A-Z]+(?![a-z])|[A-Z][a-z]*/g; 
 
for (var s = 0; s < ss.length; s++) { 
 
    console.log("Testing: ", ss[s], "... "); 
 
    console.log("Matched: ", JSON.stringify(ss[s].match(rx))); 
 
}
に続きます

の場合の場合、FBI[A-Z]+(?![a-z])としか一致しませんが、正規表現エンジンがFBIAの大文字を[A-Z]+で取得した後にトリガーされるバックトラッキングのため、大文字の後ろに小文字がない位置に戻るため、FBI一致し、A文字は次の反復で消費されたままです。

-1

次は助けるべきである:

/(?=[A-Z][a-z])/ 
+0

大文字がnedにある場合、動作しません。 「送金SPD」 – Gideon