2017-05-11 1 views
-1

文章を分割して文頭に./?/!という大文字の後にスペースが続く正規表現を見つけようとしています。大文字で区切られた文節を分割します。

"Hello there, my friend. In other words, i.e. what's up, man." 

することに分割する必要があります

Hello there, my friend| In other words, i.e. what's up, man| 

私はそれが./?/!に分割するために得ることができますが、私は運スペースや大文字基準を取得していません。私が思い付いた何

.split("/. \s[A-Z]/") 
+0

は私たちに正規表現をお見せよりも大きくなるように、そのようなスペースの数を許可するように私は、(?<=[.?!])\s+(?=[A-Z])をお勧めしたい文章に文字列を分割したい場合これまで使用しています。 –

+0

あなたは今までどの正規表現を書いていますか? – gaganshera

+0

最終的な '.'を分割するべきではありません。 –

答えて

3

は、それが./?/ある基準に基づいて、文章の中にテキストの一部を分割しました!スペースの後に大文字が続きます。

s = "Hello there, my friend. In other words, i.e. what's up, man." 
puts s.split(/[!?.](?=\s+\p{Lu})/) 

Ruby demoを参照してください:

あなたは先読みに基づく正規表現を使用することができます。文字列の末尾に区切り記号を付ける必要がある場合は、/[!?.](?=(?:\s+\p{Lu})|\s*\z)/を使用してください。

詳細

  • [!?.]は - (肯定先読みが)1+空白に続いにすぐに1つの大文字で続く -
  • (?=\s+\p{Lu})
  • !?かである . ...一致します現在の場所の権利。

Rubular demoを参照してください。

NOTE:英語のテキストを文に分割する必要がある場合は、既存のNLPソリューション/ライブラリの使用を検討する必要があります。参照:

後者は、正規表現に基づいており、簡単に多くの正規表現を拡張することができます。

2

Wiktorの回答とは別に、幅をゼロにして分割するためのルックアラウンドを使用することもできます。

正規表現:(?<=[.?!]\s)(?=[A-Z])はゼロ幅[.?!]及びスペースのいずれかが先行し、大文字に続くを見出します。

s = "Hello there, my friend. In other words, i.e. what's up, man." 
puts s.split(/(?<=[.?!]\s)(?=[A-Z])/) 

出力

Hello there, my friend. 
In other words, i.e. what's up, man. 

Ruby Demo


更新:Cary Swoveland's commentに基づいています。

OPはそれが文章の間のスペースを削除し、1

+2

これは固定幅であり、空白を制御するのが難しいので、私はここでlookbehindを使用しません。しかし、OPの例と要件は100%で一致せず、今のところ最高の回答を提供することはできません。 –

+0

@WiktorStribiżew:合意しました。 – Rahul

+0

OPが文字列を文章に分割したい場合は、文章間のスペースを取り除き、そのようなスペースの数を許可するので、 '(?<= [。?!])\ s +(?= [AZ])' 1より大きい。 –

関連する問題