7

たとえば、"Hello IB M" のような文字列がある場合、"o" と "I" の間ではなく、大文字の間のスペースを検出するにはどうすればよいですか?

基本的に「Hello IB M」は「Hello IBM」に解決されます。

これまでのところ、私はこれを持っています:

value = "Hello I B M"
value = value.replace(/([A-Z])\s([A-Z])/g, '$1$2')

ただし、「Hello IB M」のように、2 つの大文字の間のスペースの最初のインスタンスのみを置き換えます。

- 編集 -

ソリューション パート 1:

 value = value.replace(/([A-Z])\s(?=[A-Z])/g, '$1')

ソリューションの最初の部分を提供してくれた Renato に感謝します。大文字の後に大文字の単語がある場合、そのスペースも飲み込んでしまうことがわかりました。そこにあるスペースをどのように保存しますか?

したがって、「Hello IBM Dude」は「Hello IBM Dude」ではなく「Hello IBMDude」になります。

4

1 に答える 1

10

正規表現が最初に一致するとき ( on )、文字列のこの部分がエンジンによって消費されるため、正規表現にグローバル ( ) フラグ"A B"がある場合でも、再度一致することはありません。'g'

(?=PATTERN)代わりに、一致を消費しない正の先読み ( ) を使用することで、期待される結果を得ることができます。

value = "Hello I B M"
value = value.replace(/([A-Z])\s(?=[A-Z])/g, '$1')
console.log(value) // Prints "Hello IBM"

次の大文字が単語の最初にある場合にスペースを削除しないようにするには、単語境界を使用して先読みパターンをインクリメントし、\bその制限を行うことができます。

value = "Hello I B M Dude"
value = value.replace(/([A-Z])\s(?=[A-Z]\b)/g, '$1')
console.log(value) // Prints "Hello IBM Dude"

@CasimirHyppoliteが指摘したように、次の文字はオプションにする必要があります。そうしないと、文字列の最後の文字が大文字の場合、2番目の正規表現が機能しません。([^A-Za-z]|$)したがって、 「文字ではない、または文字列の末尾」として読み取ることができるpattern 。

編集@hwndが提案するよう(?=[A-Z]([^A-Za-z]|$))に、先読みを単純化する(?=[A-Z]\b)

于 2013-11-05T23:54:11.567 に答える