2013-05-02 58 views
0

這個問題是我的前一個問題的延續,以排除號碼:(。)正則表達式使用PHP

RegEx to exclude academic title

我想分裂款串入使用帶有點陣字符的正則表達式語句的數組。接下來的問題是關於數字。

下面是一個例子:

在今年2013年你好安德烈先生,你的錢是40.000盧比。

當然正確的輸出:

陣列([0] =>在今年2013 [1] =>你好安德烈先生,你的錢是 40.000盧比)

標題問題(先生)已經解決了我的問題。我試着添加數字的正則表達式,但仍然不起作用。

我沒有工作代碼:

$titles_number=array('(^[0-9]*)','(?<!Mr)', '(?<!Mrs)', '(?<!Ms)'); 
$sentences=preg_split('/('.implode('',$titles_number).')\./',$text); 
print_r($sentences); 

我能做到這一點的一個打擊(一個正則表達式來擺脫二題)?告訴我,如果我不能做到這一點。 在此先感謝

+0

您是否嘗試過使用積木'(?<\ d)'(?!\ d)'作爲負向查找並查找數字後面? – Patashu 2013-05-02 01:50:19

+2

儘管我沒有給你答案,但www.regexpal.com網站是測試正則表達式的好方法。它基於JavaScript,因此可以實時更新。我用了很多。 – blainarmstrong 2013-05-02 01:55:08

+0

感謝您的評論,仍然在努力。 http://regex101.com/也值得一試:D – andrefadila 2013-05-02 02:02:56

回答

1

這將是更容易實現與preg_match_all()

preg_match_all(
    '/[^\s.][^.]*(?:\.(?:(?<=Prof\.|Dr\.|Mr\.|Mrs\.|Ms\.)|(?=\d))[^.]*)*\./', 
    $subject, $result, PREG_PATTERN_ORDER); 
print_r($result[0]); 

解釋:

  • [^\s.]下一個非空白字符匹配(即跳過句子之間的任何空白)
  • [^.]*吃掉任何非點的字符
  • \.相匹配的點IF ...
  • (?<=Prof\.|Dr\.|Mr\.|Mrs\.|Ms\.) ......這是尊稱的一部分...
  • (?=\d) ...或數字的一部分

筆記:

  1. (?<=Prof\.|Dr\.|Mr\.|Mrs\.|Ms\.)是合法的,因爲交替是在頂層。就是說,它就像幾個不連續的後視鏡,每個都有固定的長度。這就是爲什麼我必須在每個分支中重複\.而不是使用(?<=(?:Prof|Dr|Mr|Mrs|Ms)\.)

  2. \.(?=\d)似乎足以識別作爲數字一部分的點。如果您確實需要檢查點之前和之後的數字,則可以使用(?=(?<=\d\.)\d)代替。

  3. 如果這對任何比作業問題更嚴重的事情,你應該放棄正則表達式並尋找一個自然語言處理庫。像所有這一切都是原油,它非常接近你用正則表達式可以做的極限。

+0

哇,這個完整的答案也是排除錯字的問題,謝謝師傅..:D – andrefadila 2013-05-02 08:19:36

0

可以避開數問題(也可能是其他人),如果你發現每一個點在一個句子的結尾後跟一個空格/製表符/新行或字符串的結尾:

$titles=array('(?<!Mr)', '(?<!Mrs)', '(?<!Ms)'); 
$sentences=preg_split('/('.implode('',$titles).')\.(?=\s|$)/',$text); 
print_r($sentences); 
+0

哇,好主意。但是,如果存在這樣的錯字問題,這是行不通的:「在今年2013年。你好安德烈先生,你的錢是Rp 40.000。」總體謝謝你的回答:D – andrefadila 2013-05-02 08:23:01