“可选”子字符串与正则表达式匹配

时间:2011-09-17 12:44:47

标签: php regex

我在PHP中编写一个正则表达式,需要从字符串中提取数据:

  

Naujasis Salemas,ŠiaurėsDakota
  JungtinėsValstijos(Centras,ŠiaurėsDakota)

我想提取:

  

Naujasis Salemas
  Centras

对于第一种情况,我写了[^-]*(?=,),效果很好。我想修改表达式,以便如果有括号( and ),它应该在这些括号之间搜索,然后在逗号之前提取所有内容。

只用1个表达式就可以做到这样吗?如果是这样,如果它们存在,如何在括号内进行搜索?

3 个答案:

答案 0 :(得分: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 :(得分:1)

我认为这个可以做到:

[^-(]+(?=,)

这与您的正则表达式相同,但它不允许匹配字符串中的括号。它仍然会在第一个主题上匹配,而在第二个主题上它将匹配在左括号之后。

在此处试试:http://ideone.com/Crhzz

答案 2 :(得分:1)

您可以使用

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

这将匹配除逗号或括号之外的任何文本,后跟逗号。