pl中的Perl正则表达式为“空白数”:()或双引号“”

时间:2015-01-29 13:26:19

标签: regex perl pattern-matching

我想计算内部存在的空白数:()或“”。
可以使用perl正则表达式完成。

示例:

让字符串为:

abcd(efg h i)jkl        -> count = 2
abc def(dfdsff fd)dfdsf -> count = 1

2 个答案:

答案 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