PHP正则表达式括号

时间:2011-11-21 23:49:58

标签: php regex

我有以下字符串:

test 13 (8) end 12 (14:48 IN 1ST)

我需要输出:

14:48 IN 1ST

或括号内的所有内容都在字符串的末尾。

我不需要,8这是在第一组括号内。字符串中可以有多组括号。我只需要考虑输入字符串的最后一组括号内的所有内容。

6 个答案:

答案 0 :(得分:7)

正则表达式解释

.*       Go to last
\(       Stars with (
([^)]*) 0 or more character except )
\)       Ends with 

<强>的preg_match

$str = "test 13 (8) end 12 () (14:48 IN 1ST) asd";
$regex = "/.*\(([^)]*)\)/";
preg_match($regex,$str,$matches);

$matches
array (
  0 => 'test 13 (8) end 12 () (14:48 IN 1ST)',
  1 => '14:48 IN 1ST',
)

接受清空preg_match_all

$str = "test 13 (8) end 12 () (14:48 IN 1ST) asd";
$regex = "/\(([^)]*)\)/";

preg_match_all($regex,$str,$matches);

$matches
array (
  0 => 
  array (
    0 => '(8)',
    1 => '()',
    2 => '(14:48 IN 1ST)',
  ),
  1 => 
  array (
    0 => '8',
    1 => '',
    2 => '14:48 IN 1ST',
  ),
)

不接受清空preg_match_all

$str = "test 13 (8) end 12 () (14:48 IN 1ST) asd";
$regex = "/\(([^)]+)\)/";

preg_match_all($regex,$str,$matches);

$matches
array (
  0 => 
  array (
    0 => '(8)',
    1 => '(14:48 IN 1ST)',
  ),
  1 => 
  array (
    0 => '8',
    1 => '14:48 IN 1ST',
  ),
)

答案 1 :(得分:2)

我不会使用正则表达式,这是不必要的。

使用strrpossubstr提取您需要的字符串。它简单,直接,并实现了所需的输出。

它的工作原理是找到字符串中的最后一个'(',并从字符串的末尾删除一个字符。

$str = "test 13 (8) end 12 (14:48 IN 1ST)";
echo substr( $str, strrpos( $str, '(')  + 1, -1);

$str = "(dont want to capture the (8)) test 13 (8) end 12 (14:48 IN 1ST)";
echo substr( $str, strrpos( $str, '(')  + 1, -1);

Demo

编辑:我还应注意,我的解决方案适用于以下所有情况:

  1. 空括号
  2. 一组括号(即所需分组之前的字符串不包含括号)
  3. 超过三组括号(只要所需的分组位于字符串的末尾)
  4. 最后一个括号分组后面的任何文字(按照下面的编辑)
  5. 最终编辑:同样,我不能强调使用正则表达式是不必要的。这是一个example,显示字符串操作比使用正则表达式快3倍 - 快7倍。

    根据MetaEd的评论,我可以轻松修改我的示例/代码,以忽略最后一个括号后的文本。

    $str = "test 13 (8) end 12 (14:48 IN 1ST) fkjdsafjdsa";
    $beginning = substr( $str, strrpos( $str, '(')  + 1);
    substr( $beginning, 0, strpos( $beginning, ')')) . "\n";
    

    STILL faster than a regex

答案 2 :(得分:0)

\(.*\)将匹配第一个和最后一个parens。为了防止这种情况,请从.*开始,这将贪婪地消耗所有内容直到最终打开的paren。然后在你想要输出的内容周围放置一个捕获组,你有:

.*\((.*)\)

答案 3 :(得分:0)

我会选择以下正则表达式:

.*\(([^)]+)\)

答案 4 :(得分:-1)

此正则表达式将执行:.+\((.+?)\)$

转出括号,用?做非+贪婪,并确保它在行尾。

如果之后可能有字符,请尝试改为:

.\).+\((.+?)\)

这基本上确保只有第二个括号匹配。我仍然更喜欢第一个。

答案 5 :(得分:-2)

最简单的方法是将字符串拆分为')',然后从结果数组中的最后一项获取所有内容,直到'('...我知道它不是严格的正则表达式,但它足够接近。

[编辑] (为了确保那些喜欢在真正了解所说内容之前投票的人......(比如JV),可以考虑实际的代码)......

"test 13 (8) end 12 (14:48 IN 1ST)".split( /)/);

这将产生一个包含两个元素的数组...... “测试13(8” 和 “结束12(1月14日14:48”

请注意,无论你有多少(xyz),你都会得到最后一个数组项中的最后一个。

然后你只需查看最后一项'(',如果有的话就抓住它背后的一切。

我怀疑这比直接的正则表达式方法更快,但我没有测试过,所以无法保证...无论它是否正常工作。 [/编辑]