2013-04-06 7 views
11

के साथ पैराग्राफ को वाक्यों में विभाजित करना मैं एक regexp नोब हूं और अनुच्छेदों को वाक्यों में विभाजित करने की कोशिश कर रहा हूं। मेरी भाषा में हम वाक्यों के मध्य में संक्षेप में संक्षेप में (जैसे: bl.a.) का उपयोग करते हैं, इसलिए मैं निष्कर्ष पर आया हूं कि मुझे जो करना है वह विराम चिह्नों को देखना है, जिसके बाद एकल अंतरिक्ष और फिर एक शब्द है जो की तरह बड़े अक्षर से शुरू होता है:regexp और PHP

[sentence1]...anymore. However...[sentence2] 

तो किसी अनुच्छेद की तरह:

[0] => Der er en lang og bevæget forhistorie bag lov om varsling m.v. i forbindelse med afskedigelser af større omfang. 
[1] => Det er ikke en bureaukratisk lovtekst blandt så mange andre. 

और नहीं इस:

Der er en lang og bevæget forhistorie bag lov om varsling m.v. i forbindelse med afskedigelser af større omfang. Det er ikke en bureaukratisk lovtekst blandt så mange andre. 

इस उत्पादन में समाप्त होना चाहिए

[0] => Der er en lang og bevæget forhistorie bag lov om varsling m.v. 
[1] => i forbindelse med afskedigelser af større omfang. 
[2] => Det er ikke en bureaukratisk lovtekst blandt så mange andre. 

मैं एक समाधान है कि सकारात्मक lookbehind सुविधा के साथ इस के पहले भाग करता पाया है:

$regexp = (?<=[.!?] | [.!?][\'"]); 

और फिर

$sentences = preg_split($regexp, $paragraph, -1, PREG_SPLIT_NO_EMPTY); 

जो एक महान शुरुआती बिंदु है, लेकिन विभाजन कई संक्षेपों के कारण कई बार रास्ता।

मैं यह करने की कोशिश की है:

(?<=[.!?]\s[A-Z] | [.!?][\'"]) 

या तो

. or ! or ? 

एक अंतरिक्ष और बड़े अक्षर के बाद के हर घटना को लक्षित करने के लिए, लेकिन बात नहीं बनी।

क्या कोई जानता है, अगर मैं ऐसा करने का प्रयास कर रहा हूं तो पूरा करने का कोई तरीका है?

+0

तो तुम एक नई पंक्ति बनाना चाहते हैं जब भी 'इस के मानदंड तोड़ें। है'? –

+0

जरूरी नहीं है, मैं preg_split PHP फ़ंक्शन के आउटपुट प्रारूप से काफी संतुष्ट हूं। मैं जो संघर्ष करता हूं वह रेगेक्सप लिख रहा है जो 'यह' ढूंढता है। क्या 'मानदंड है। – acrmuui

+0

हाय, उत्तर देने के लिए धन्यवाद। मैंने वास्तव में पोस्ट करने से पहले उन सटीक उत्तरों के माध्यम से पढ़ा है, लेकिन मुझे उनमें से कोई भी नहीं मिला, जो एक पेंशन के सटीक पैटर्न की खोज करता है जिसके बाद एक शब्द होता है जिसके बाद एक पूंजी पत्र से शुरू होता है। या क्या मैं कुछ न कुछ भूल रहा हूं? – acrmuui

उत्तर

12

यूनीकोड ​​RegExp: (?<=[.?!;])\s+(?=\p{Lu})

डेमो यहां बताई गई है: http://regex101.com/r/iR7cC8

+0

धन्यवाद यह बहुत काम करता है अच्छी तरह से! – acrmuui

+0

"यूनिकोड" यहां भ्रामक है। यह रेगेक्स यूनिकोड कैरेक्टर प्रॉपर्टीज का उपयोग करता है, लेकिन यह ** ** ** UAX 29 द्वारा परिभाषित यूनिकोड वाक्य सीमा नियमों को लागू नहीं करता है। – NikiC

+0

@NikiC यह वास्तव में मूर्ख नहीं है लेकिन UAX29 भी नोट्स: * ... कार्यान्वयन आवश्यकताओं को पूरा करने के परिणामों को ओवरराइड (दर्जी) करने के लिए स्वतंत्र हैं ... * –

3

इस तरह के एक पैटर्न के लिए खोज अभी भी अविश्वसनीय लग रहा है लेकिन के रूप में वाक्य लाइन रिटर्न द्वारा समाप्त किया जा सकता है मैं सिर्फ निम्न

[.\!\?][\s\n\r\t][A-Z] 

मुझे नहीं लगता कि आप वास्तव में देखो आगे के लिए बने आप करते हैं की कोशिश करेंगे? (!? एक साथ है, तो \ का उपयोग कर इसे निकल जाता है - बताता regex किसी भी विशेष अर्थ पर ध्यान न दें) बंटवारे वाक्य के लिए

+0

@ka पोस्ट किए गए उदाहरण में उद्धरण उपयोग नहीं है। सिद्धांत में यह दोनों में शामिल है, प्रैक्टिस में मुझे विभिन्न जावा/PHP संस्करणों/विधियों का उपयोग करके विभिन्न परिणाम मिल गए हैं –