每次出现“/ * - +”并保留分隔符时,如何将字符串拆分成碎片?所以,有类似
的东西10x+4-1
变成
10x
+
4
-
1
我试过
@left_split = split(/(?<=\+)(?<=\-)(?<=\/)(?<=\*)/, $left_side);
我希望将分隔符放在自己的数组[]中。
然而,如果像
那样的话4(x-3)
出现,如何阻止reg-ex拆分4(x和-3)?
答案 0 :(得分:3)
值得称赞的是,您尝试为your previous question撰写解决方案,但您确实会发现它非常困难。
执行此操作的方法是使用逐步 tokeniser ,就像这样。它将忽略任何空格并捕获任何括号,如果它碰到任何无效字符,它将停止解析字符串。
use strict;
use warnings;
my $s = '10x+4-1';
my $tokens = qr{ \+ | \- | \* | / | \d+ | [a-z]+ | \( | \) }x;
while ( $s =~ m{ \G \s* ( $tokens ) }gx ) {
my $token = $1;
print $token, "\n";
}
<强>输出强>
10
x
+
4
-
1
答案 1 :(得分:1)
您可以在split中使用的正则表达式周围放置一个捕获组:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
或者:
split(/([+*\/-])/, '10x+4-1')
# ('10x', '+', '4', '-', '1')
打印:
print join("\n", split(/([+*\/-])/, '10x+4-1'));
答案 2 :(得分:0)
您可以使用
(?<=[+*\/-])|(?=[+*\/-])
说明:
(?<=[+*\/-])
在后方匹配为+, *, / or -
(?=[+*\/-])
前瞻匹配为+, *, / or -
代码:@left_split = split(/(?<=[+*\/-])|(?=[+*\/-])/, $left_side);
修改:要限制分割4(x-3)
之类的字符串,您可以使用
((?<=[+*\/-])|(?=[+*\/-]))(?!.*?\))
请参阅DEMO