我有以下字符串:
test 13 (8) end 12 (14:48 IN 1ST)
我需要输出:
14:48 IN 1ST
或括号内的所有内容都在字符串的末尾。
我不需要,8这是在第一组括号内。字符串中可以有多组括号。我只需要考虑输入字符串的最后一组括号内的所有内容。
答案 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)
我不会使用正则表达式,这是不必要的。
使用strrpos和substr提取您需要的字符串。它简单,直接,并实现了所需的输出。
它的工作原理是找到字符串中的最后一个'(',并从字符串的末尾删除一个字符。
$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);
编辑:我还应注意,我的解决方案适用于以下所有情况:
最终编辑:同样,我不能强调使用正则表达式是不必要的。这是一个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";
答案 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),你都会得到最后一个数组项中的最后一个。
然后你只需查看最后一项'(',如果有的话就抓住它背后的一切。
我怀疑这比直接的正则表达式方法更快,但我没有测试过,所以无法保证...无论它是否正常工作。 [/编辑]