2015-04-25 75 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 
相關問題