示例输入字符串:
(F1 (F2 X (Y) Z) (F3 A B)
我要匹配的内容:\w+
前面没有(
,除非后跟)
在这种情况下:X
,Y
,Z
,A
和B
暂时的解决方法(我知道以后会给我提出问题)是/\(\w+\)| \w+/
,但是因为它也匹配空格,所以它会在未来发生问题,特别是当它到达目的地时取代比赛。
我在以负面形式进行了一些实验:
/(?!=\()\w+/
...但我似乎无法找到一种方法将它与“之前的组合”(
要明确:
答案 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