正则表达式如何匹配字符串中的所有()之间的字符串。

如:字符串abc(@a)defghi(@b)aaaaa,如何获取所有()中间的字符串?

第1个回答  推荐于2016-02-26
哎、这个测试好久!在perl里面简直机关重重啊、看结果:
[u@H /billing/user/xufc/pp]$perl
my $line='abc(@a)defghi(@b)aaaaa'; #要用单引号、双引号perl就先给你认为括号里面为空
my @array=($line =~ m/\((.*?)\)/g) ; #语法叫“列表上下文中的m//”,匹配(XX),然后提取出XX
print "@array\n"; #输入完成后、按ctrl+D代表程序结束
@a @b #输出的结果
[u@H /billing/user/xufc/pp]$

这个是perl里面的,其它语言不知道怎么用追问

不知那个 ~m 怎么理解,我把后面的部分——/\((.*?)\)/g试了下,发现还是上面答案一样的问题,大概真的是flex自己的问题吧,我在网上也看了一些别的例子,基本上都是会出现这个问题,我试着自己组了一下表达式,也不行……哎……

不过还是谢谢啦!~

追答

~m、这个不是这样的,=~,这个符号代表匹配;后面的m/\((.*?)\)/g,m//这个叫做模式、m是个简称可以不写的、直接用//;

发现还是上面答案一样的问题?这个有问题吗,不是结果正确的啊!

追问

哦,我没接触过perl,不知道那个是匹配,见笑了~
前面都去掉的话,剩下的不就是 /\((.*?)\)/g 了吗?我刚才试的就是这个式子

追答

是的、用
@a @b #输出的结果,如故用perl 这个输出的结果就是你想要的;flex可能不支持这种正则表达式

本回答被提问者和网友采纳
第2个回答  2012-09-26
"(?<=\()[^()]+(?=\))"追问

这个式子我知道,但是只能找到一个,而且中间()需要加转义字符吧……
我用的flex,在表达式后面加g再match的话——(?<=\()[^\(\)]+(?=\))/g ,会出现读取两次第一个()中内容的情况,不知道哪里出了错,请帮忙啊~

追答

有的正则引擎不支持(?<
可能是这种原因吧
我没用过flex
有没有
这种 "\(([^()]+)\)"
取Group1的试一下

追问

我试了"\(([^()]+)\)"这个,不过也不行,还是会出现读取两次第一个()中内容的情况,而且我发现你给的第一个式子跟这个效果一样,也就是说中间的转义字符加不加皆可,难道说我理解错了,那并不是个转义字符?还是中间根本就没起作用?

追答

由于没用过flex
所以这个问题我解决不了了

第3个回答  推荐于2018-05-10
[u@H /billing/user/xufc/pp]$perl
my $line='abc(@a)defghi(@b)aaaaa'; #要用单引号、双引号perl就先给你认为括号里面为空
my @array=($line =~ m/\((.*?)\)/g) ; #语法叫“列表上下文中的m//”,匹配(XX),然后提取出XX
print "@array\n"; #输入完成后、按ctrl+D代表程序结束
@a @b #输出的结果
[u@H /billing/user/xufc/pp]$

这个是perl里面的,其它语言不知道怎么用
相似回答