2017-05-11 54 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

向我們展示你的正則表達式到目前爲止使用。 –

+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)/

詳細

  • [!?.] - 匹配的!?.這是...
  • (?=\s+\p{Lu}) - (正前瞻),隨後與1+空格,接着用1個大寫字母立即當前位置的權利。

查看Rubular demo

注意:如果您需要將常規英文文本拆分爲句子,則應考慮使用現有的NLP解決方案/庫。參見:

後者是基於正則表達式,並且可以容易地與多個正則表達式延長。

2

除了Wiktor的答案你還可以使用lookarounds找零寬度和分裂。

正則表達式:(?<=[.?!]\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想打破串入句子我建議(?<=[.?!])\s+(?=[A-Z]),因爲它句子之間消除空間,並能使這種空間的數量大於一

+2

我不會在這裏使用lookbehind,因爲它的寬度是固定的,並且很難控制空白。但是,OP示例和要求不能100%匹配,目前無法提供最佳答案。 –

+0

@WiktorStribiżew:同意。 – Rahul

+0

如果OP想要將字符串分解成句子,我會建議'(?<= [。?!])\ s +(?= [AZ])',因爲它刪除句子之間的空格,並允許這些空格的數量大於一個。 –

相關問題