我有一个脚本,我需要从文本字符串中获取三个部分,然后将它们返回到数组中。经过几次尝试和失败之后,我无法让它发挥作用。
文本字符串可能如下所示:
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中使用。
提前致谢!
答案 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)
这样的东西?
([^(]++)(?: \(([^)]++)\))?(?: \[([^\]]++)\])?