我在PHP中编写一个正则表达式,需要从字符串中提取数据:
Naujasis Salemas,ŠiaurėsDakota
JungtinėsValstijos(Centras,ŠiaurėsDakota)
我想提取:
Naujasis Salemas
Centras
对于第一种情况,我写了[^-]*(?=,)
,效果很好。我想修改表达式,以便如果有括号( and )
,它应该在这些括号之间搜索,然后在逗号之前提取所有内容。
只用1个表达式就可以做到这样吗?如果是这样,如果它们存在,如何在括号内进行搜索?
答案 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)
您可以使用
[^(),]+(?=,)
这将匹配除逗号或括号之外的任何文本,后跟逗号。