RegEx将字符串除以+ * - /并保持分隔符?

时间:2015-04-25 19:55:24

标签: arrays regex string perl split

每次出现“/ * - +”并保留分隔符时,如何将字符串拆分成碎片?所以,有类似

的东西
10x+4-1

变成

10x
+
4
-
1

我试过

@left_split = split(/(?<=\+)(?<=\-)(?<=\/)(?<=\*)/, $left_side);

我希望将分隔符放在自己的数组[]中。

然而,如果像

那样的话
4(x-3)

出现,如何阻止reg-ex拆分4(x和-3)?

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