正则表达式匹配“之前没有,除非后面跟着”

时间:2012-01-16 03:53:40

标签: regex perl lisp

示例输入字符串:

(F1 (F2 X (Y) Z) (F3 A B)

我要匹配的内容:\w+前面没有(,除非后跟)
在这种情况下:XYZAB

暂时的解决方法(我知道以后会给我提出问题)是/\(\w+\)| \w+/,但是因为它也匹配空格,所以它会在未来发生问题,特别是当它到达目的地时取代比赛。

我在以负面形式进行了一些实验:

/(?!=\()\w+/

...但我似乎无法找到一种方法将它与“之前的组合”(

要明确:

  • 这种情况下的匹配都是单个字母,但实际数据可能是多个字符,甚至可能不是字母数字。
  • 没有空格或括号可以作为返回匹配的一部分。

5 个答案:

答案 0 :(得分:2)

试试这个:

(?<=[ (])\w(?=[ )])

在此处查看:[{3}}


实际上,这可能就是你要找的东西:

(?<= )\w+(?=[ )])|(?<=\()\w+(?=\))

在此处查看:[{3}}

答案 1 :(得分:1)

/(?<! [(\w] (?! \w+ \) ) ) \w+/x

/(?<! [(\w] ) \w+ | (?<= \( ) \w+ (?= \) )/x

答案 2 :(得分:1)

您可以简单地使用替换来删除已知的错误,而不是尝试将条件组合到正则表达式中:

my $str = "(F1 (F2 X (Y) Z) (F3 A B)";
$str =~ s/\(\w+(?![)\w])//g;

即。任何开括号,后跟字母数字,后面没有右括号或更多的字母数字。

然后提取字母数字是一件简单的事情:

my @items = $str =~ /\w+/g;
say for @items;

答案 3 :(得分:0)

Matching math expression with regular expression?处有一个匹配的父对象和perl正则表达式的精彩写法但是,不推荐使用任何类型的可维护代码。常规代码执行此操作;但很容易:(下面的psudeocode)

match=true; 
while(match && ch=getchar())
    if(ch==')')
        pop() or match=false
    else if(ch=='(')
        push(ch);
    else if(!isalphanum(ch) &&  ch=!' ')
        match=false;
if(match)
   match=pop()

答案 4 :(得分:0)

使用交替和前瞻/后方的替代方法。这样我们就可以匹配带括号的令牌或不带括号

的令牌
perl -e '$string="(F1 (F2 X (Y) Z) (F3 A B)";
@params=$string=~/((?<=\()\w+(?=\))|(?<![(\w])\w+)(?!\w)/g;
print join(",",@params),"\n";'

X,Y,Z,A,B