2015-04-25 34 views
1

如何在每次出现“/ * - +”时将字符串拆分为小块并保留分隔符?所以,有这样的事正则表达式将字符串除以+ * - /并保留分隔符?

10x+4-1 

转成

10x 
+ 
4 
- 
1 

我已经试过

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

我想要的分隔符被放置在自己的数组[]。

但是,如果出现类似

4(x-3) 

,如何从分裂4停止REG-EX(x和 - 3)?

+0

提供具有期望输出沿一个完整的示例。 –

+0

@ nat47检查编辑答案:) –

+0

感谢您编辑的答案! – jonbon

回答

0

您可以使用

(?<=[+*\/-])|(?=[+*\/-]) 

说明:

  • (?<=[+*\/-])位置,回顾后的比赛是+, *,/or -
  • (?=[+*\/-])位置,先行匹配+, *,/or -

码:@left_split = split(/(?<=[+*\/-])|(?=[+*\/-])/, $left_side);

编辑:限制拆就喜欢4(x-3)字符串可以使用

((?<=[+*\/-])|(?=[+*\/-]))(?!.*?\)) 

DEMO

+0

为什么它在这个https://regex101.com/r/iX2fB9/8失败? –

+0

太棒了!这是令人惊讶的工作,除了它添加了一些元素到数组,只有''例如,方程:3(7x-1)+ 10x-4 + 3x = 90x + 1给出的输出为 $ VAR1 ='3 7X-1)'; $ VAR2 =''; $ VAR3 ='+'; $ VAR4 =''; $ VAR5 ='10x'; $ VAR6 =''; – jonbon

+0

@ nat47:为了获得更好的可读性,您应该使用'Dumper'和* references *作为数组,例如'print Dumper \ @ array' – Borodin

1

您可以将捕获组围绕split使用正则表达式:

split(/([+*\/-])/, '10x+4-1') 
# ('10x', '+', '4', '-', '1') 

或者:

print join("\n", split(/([+*\/-])/, '10x+4-1')); 

打印:

10x 
+ 
4 
- 
1 
3

这是值得称赞的,你正在做一个尝试写一个解决your previous question但你真的会发现它非常困难。

要做到这一点的方法是用步进的记号器,像这样。它将忽略任何空格并捕获任何括号,如果遇到任何无效字符,它将停止解析字符串。

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 
相关问题