Arrays 正则表达式将字符串除以+*-/并保留分隔符?

Arrays 正则表达式将字符串除以+*-/并保留分隔符?,arrays,regex,string,perl,split,Arrays,Regex,String,Perl,Split,如何在每次出现/*-+时将字符串分割成若干段并保留分隔符?所以,吃点类似的东西 10x+4-1 变成 10x + 4 - 1 我试过了 @left_split = split(/(?<=\+)(?<=\-)(?<=\/)(?<=\*)/, $left_side); 出现时,如何阻止reg ex拆分4x和-3?您可以使用 (?<=[+*\/-])|(?=[+*\/-]) 请参见您可以使用的 (?<=[+*\/-])|(?=[+*\/-]) 请参见您可以

如何在每次出现/*-+时将字符串分割成若干段并保留分隔符?所以,吃点类似的东西

10x+4-1
变成

10x
+
4
-
1
我试过了

@left_split = split(/(?<=\+)(?<=\-)(?<=\/)(?<=\*)/, $left_side);
出现时,如何阻止reg ex拆分4x和-3?

您可以使用

(?<=[+*\/-])|(?=[+*\/-])
请参见您可以使用的

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

请参见

您可以在中使用的正则表达式周围放置一个捕获组:

或:

印刷品:

10x
+
4
-
1

您可以将捕获组放在以下中使用的正则表达式周围:

或:

印刷品:

10x
+
4
-
1

值得称赞的是,您正在尝试编写解决方案,但您确实会发现这非常困难

实现这一点的方法是使用一个分步标记器,如下所示。它将忽略任何空格并捕获任何括号,如果遇到任何无效字符,它将停止解析字符串

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";
}
输出


值得称赞的是,您正在尝试编写解决方案,但您确实会发现这非常困难

实现这一点的方法是使用一个分步标记器,如下所示。它将忽略任何空格并捕获任何括号,如果遇到任何无效字符,它将停止解析字符串

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";
}
输出


提供完整的示例以及预期的输出。@nat47检查编辑的答案:谢谢编辑的答案!看,你在试着解析算术表达式吗?如果是这样,正则表达式就无法做到这一点。您需要一个标记器和一个下推堆栈解析器。我建议您为此使用一个CPAN模块,如Parse::RecDescent。提供完整的示例以及预期的输出。@nat47检查编辑的答案:谢谢编辑的答案!看,你在试着解析算术表达式吗?如果是这样,正则表达式就无法做到这一点。您需要一个标记器和一个下推堆栈解析器。我建议您为此使用一个CPAN模块,如Parse::RecDescent。令人惊叹的这项工作令人惊讶,只是它向数组中添加了一些元素,例如,一个等式:37x-1+10x-4+3x=90x+1给出了$VAR1='37x-1'的输出$VAR2=$VAR3='+'$VAR4=$VAR5='10x'$VAR6=@nat47:为了更好的可读性,您应该将转储程序与数组的引用一起使用,比如print Dumper\@arrayAwesome!这项工作令人惊讶,只是它向数组中添加了一些元素,例如,一个等式:37x-1+10x-4+3x=90x+1给出了$VAR1='37x-1'的输出$VAR2=$VAR3='+'$VAR4=$VAR5='10x'$VAR6=@nat47:为了更好的可读性,您应该将转储程序与数组的引用一起使用,比如print Dumper\@array
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