我想计算内部存在的空白数:()或“”。
可以使用perl正则表达式完成。
示例:
让字符串为:
abcd(efg h i)jkl -> count = 2
abc def(dfdsff fd)dfdsf -> count = 1
答案 0 :(得分:0)
( )(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)|( )(?=[^(]*\))
你可以尝试这个。计算群组数量。参见演示。
https://regex101.com/r/zM7yV5/6
我们在space
或""
内找到()
。一旦我们发现我们捕获并计算了我们找到的群组数量,那就是答案。
( )(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)
==>这里的前瞻确保它在它前面找到"
,然后在它前面找到""
组。在前面的"
短奇数它使我们能够选择space
之间的""
,因为它前面会有奇数"
。
( )(?=[^(]*\))
==>前瞻意味着它应该在没有)
的情况下找到(
。因此,我们可以在()
之间创建空格。虽然这对嵌套的()
不起作用。
答案 1 :(得分:0)
您可以使用正则表达式查找并捕获括号中的字符串,并使用tr///
来计算被破坏的字符串中的空格字符数。
该计划证明了这一原则。它从DATA
文件句柄中读取字符串(我使用了您问题中的示例数据,但重复了它以提供包含双引号的示例)并假设只有一个对每个字符串中的括号或引号。
我已经使用分支重置构造(?| ... )
,以便在$1
中捕获括号内容,无论它是括号还是匹配的双引号。< / p>
如果假设是不真实的,修改代码是一件简单的事情,但是你已经在评论中询问过它并且没有提供答案。
use strict;
use warnings;
use List::Util 'max';
my $re = qr/ (?|
\( ( [^()]+ ) \)
|
" ( [^()]+ ) "
) /x;
my @data = <DATA>;
chomp @data;
my $width = max map length, @data;
for (@data) {
chomp;
if ( $_ =~ $re ) {
my $count = $1 =~ tr/\x20\t//;
printf "%-*s -> count = %d\n", $width, $_, $count;
}
}
__DATA__
abcd(efg h i)jkl
abc def(dfdsff fd)dfdsf
abcd"efg h i"jkl
abc def"dfdsff fd"dfdsf
<强>输出强>
abcd(efg h i)jkl -> count = 2
abc def(dfdsff fd)dfdsf -> count = 1
abcd"efg h i"jkl -> count = 2
abc def"dfdsff fd"dfdsf -> count = 1