2011-09-17 53 views
0

我寫在PHP中的正則表達式,將需要從字符串看起來像提取日期:「可選」串匹配與正則表達式

新塞勒姆,北達科他州
美國(中心,北達科他州)

我想提取:

新塞勒姆
中心

對於第一種情況,我已經寫了[^-]*(?=,),這工作得很好。我想修改表達式所以,如果有(and)括號,它不應該那些括號之間搜索,然後提取逗號之前的一切。

是否有可能做這樣的事情只有1個表達?如果是這樣,我怎樣才能讓它在括號內進行搜索如果真的存在?

回答

1

我覺得這個人能做到這一點:

[^-(]+(?=,) 

這是一樣的您正則表達式,但它不允許匹配的字符串的括號內。它仍然匹配的第一個主題,並在第二個它只會在左括號後匹配。

這裏試試:http://ideone.com/Crhzz

+0

謝謝!這工作完全 – F21

1

你可以使用

[^(),]+(?=,) 

這將匹配除逗號或圓括號的任何文本,跟一個逗號。

2

一個conditional可能會幫助你在這裏:

$stra = 'Naujasis Salemas, Šiaurės Dakota'; 
$strb = 'Jungtinės Valstijos (Centras, Šiaurės Dakota)'; 

$regex = ' 
    /^     # Anchor at start of string. 
    (?(?=.*\(.+,.*\)) # Condition to check for: presence of text in parenthesis. 
     .*\(([^,]+)  # If condition matches, match inside parenthesis to first comma. 
     | ([^,]+)   # Else match start of string to first comma. 
    ) 
    /x 
'; 
preg_match($regex, $stra, $matches) and print_r($matches); 

/* 
Array 
(
    [0] => Naujasis Salemas 
    [1] => 
    [2] => Naujasis Salemas 
) 
*/ 

preg_match($regex, $strb, $matches) and print_r($matches); 

/* 
Array 
(
    [0] => Jungtinės Valstijos (Centras 
    [1] => Centras 
) 
*/ 

注意那略高於$matches變化的指數,但你可能不能夠使用若要解決named subpatterns

+1

尼斯:) :)(你可以使用['x'修飾符(http://docs.php.net/manual/en/reference.pcre.pattern.modifiers.php)在正則表達式發表評論直接;)), – arnaud576875

+0

啊,謝謝!我敢發誓我看到了正則表達式評論別的地方的SO,它被竊聽我,我不能讓它爲我工作(: – 2011-09-17 17:02:42