我使用以下正则表达式匹配下面的字符串,到目前为止一切顺利。现在,我怎样才能使BAZ的内容可选,以便与BAZ()
的情况相匹配$str = '- 10 TEST (FOO 3 TEST.BAR 213 BAZ (\HELLO) TEST';
preg_match('/FOO (\d+).+BAR (\d+).+BAZ \(\\\\(\w+)\)/i', $str, $match);
$str = '- 10 TEST (FOO 3 TEST.BAR 213 BAZ () TEST';
$array = array(
'FOO' => 3,
'BAR' => 213,
'BAZ' =>
);
答案 0 :(得分:1)
要使某些内容可选,您可以将其放入非捕获组(?: ... )
,然后在该组之后放置一个问号。问号是一个量词,意思是“零或一”。
换句话说,改变这个:
\\\\(\w+)
到此:
(?:\\\\(\w+))?
所以整个表达式变成:
/FOO (\d+).+BAR (\d+).+BAZ \((?:\\\\(\w+))?\)/i
答案 1 :(得分:1)
听起来您只想将整个事物包装在非捕获组中并添加?
运算符。
/FOO (\d+).+BAR (\d+).+BAZ (?:\(\\\\(\w+)\))?/i
请注意,这会捕获BAZ后没有括号。如果您正在寻找BAZ(),请使用:
/FOO (\d+).+BAR (\d+).+BAZ \((?:\\\\(\w+))?\)/i