2016-02-04 35 views
2

我有以下字符串,它帶有格式country:Cum name,Extra info如何使用正則表達式分隔字符串的部分

Asia: Asian Cup - Play Offs 
Asia: Asian Cup 
Asia: World Cup - Qualification - First Stage 
Australia: A-League 
Belgium: Jupiler League - Championship Group 
Brazil: Série A 

我遇到的問題是如何使用正則表達式分隔每行信息。

更具體的,從我喜歡導出以下信息的第一行:

[ Asia, Asian Cup, Play Offs ] 

從第二信息

[ Asia, Asian Cup ] 

等。

目前我有嘗試以下語句:

^([\w]+\:\s+)[^\-]+(?!\-\s)+ 

沒有完成,我不知道如何繼續與此有關。我的主要問題是我不知道如何否定聲明的一部分。

那麼,解決這個問題的方法是什麼?

在這裏,我有一個實時編輯例如:http://refiddle.com/refiddles/56b3960775622d40bb050000

+1

可以' 「 - 」'出現在第一和第二部分也? – anubhava

+0

@anubhava是的,但第二個是分離額外信息 –

+1

也許['\ b \ p {Lu} \ p {L} *(?:[ - ] \ p {Lu} \ p {L} *) * \ B'(https://regex101.com/r/vU7eR2/1)?之前,用'\ n'爆炸。 –

回答

2

你可以在PHP中試試這個正則表達式:

/^(\p{Lu}\p{L}*):\h*(.+?)(?:\h-\h(.+))?$/mu 

RegEx Demo

+0

你知道如何修改第一部分的空格嗎?像'某個單詞:另一個單詞 - 額外單詞' –

+1

您可以使用['^(\ p {Lu} [\ p {L}] *):\ h *(。+?)(?:\ h- \ h (。+))?$'](https://regex101.com/r/dG8nN0/2) – anubhava

+1

非常感謝anubhava –

1

首先,explose上\n您的字符串,那麼你可以使用下面的正則表達式:

([\w\s]+): ([\w ]+)(?:- ?([\w -]+))? 

這裏解釋https://regex101.com/r/lV7lT0/1

+0

幾乎完成:)但由於unicode字符不匹配'Série'。這可以得到改善嗎?謝謝:) –

+0

@MerianosNikos anubhava給了一個更好的,你可以使用它 – Gwendal

3

您可以使用explode

$lines = ['Asia: Asian Cup - Play Offs', 
      'Asia: Asian Cup', 
      'Asia: World Cup - Qualification - First Stage', 
      'Australia: A-League', 
      'Belgium: Jupiler League - Championship Group', 
      'Brazil: Série A']; 

$results = array_map(function ($i) { 
    $ret = []; 
    list($ret[0], $tmp) = explode(': ',$i, 2); 
    return array_merge($ret, explode(' - ', $tmp, 2)); 
}, $lines); 

print_r($results); 
相關問題