你能帮我做这个正则表达吗?

时间:2009-03-14 09:40:04

标签: php regex

我有一个脚本,我需要从文本字符串中获取三个部分,然后将它们返回到数组中。经过几次尝试和失败之后,我无法让它发挥作用。

文本字符串可能如下所示:

Some place
Some place (often text in parenthesis)
Some place (often text in parenthesis) [even text in brackets sometimes]

我需要将这些字符串拆分为三个:

{Some place} ({often text in parenthesis}) [{even text i brackets sometimes}]

应返回:

1: Some place
2: often text in parenthesis
3: even text in brackets sometimes

我知道这应该是一项简单的任务,但我无法解决正确的正则表达式。这将在PHP中使用。

提前致谢!

4 个答案:

答案 0 :(得分:2)

尝试这样的事情:

$result = preg_match('/
  ^ ([^(]+?)
  (\s* \( ([^)]++) \))?
  (\s* \[ ([^\]]++) \])?
  \s*
  $/x', $mystring, $matches);

print_r($matches);

请注意,在此示例中,您可能最感兴趣的是$ matches [1],$ matches [3]和$ matches [5]。

答案 1 :(得分:1)

将问题拆分为三个正则表达式。在第一个括号之后,在第一个括号之前得到每个字符,保存你的位置 - 与刚刚提取的字符串的长度相同。

然后在第二步中,执行相同操作,但抓住所有内容直到右括号。 (嵌套括号使得这个更复杂,但不会太多。)再次,将指针保存到第二个字符串的末尾。

获得第三个字符串是微不足道的。

答案 2 :(得分:1)

我可能会将它作为三个正则表达式,从括号和括号开始,如果失败则回退到较少的项目。

^(.*?)\s+\((.*?)\)\s+\[(.*?)\]\s+$

如果失败,请尝试:

^(.*?)\s+\((.*?)\)\s+$

如果失败也尝试:

^\s+(.*?)\s+$

我确信它们可以组合成一个正则表达式,但我不会尝试。

答案 3 :(得分:1)

这样的东西?

([^(]++)(?: \(([^)]++)\))?(?: \[([^\]]++)\])?