0
<> =~ m/([\+-][0-9]*)x|([\+-][0-9]*)y/;
print "$1, $2";

各种输入的输出是:

3x+1y    ----->, +1
10x-2y   -----> ,  -2
-5x+2y   -----> -5, 
-10x+5y  -----> -10, 

它基本上是随机的,有时会打印出 x 的系数,有时会打印出 y。出了什么问题?

4

3 回答 3

5

你的模式有一个交替:/(...)x|(...)y/. 因此,您的模式匹配类似-2x或的内容+5y

另一个错误是您需要 x 坐标上的符号(+ 或 -)。你可能想要一个像这样的正则表达式:

/^\s* ([+-]?[0-9]+)x ([+-][0-9]+)y \s*$/x
于 2013-09-08T19:20:57.597 回答
1

我建议使用前瞻,这样您就不会消耗字符并获得更清晰的匹配:

^(?=.*?([+-]?[0-9]*)x)(?=.*?([+-]?[0-9]*)y)

您更正的正则表达式(您忘记?指示可选符号)与我建议的正则表达式进行比较。

捕获的组在第一个正则表达式中“无处不在”。

它还允许 x 和 y 变量的任何顺序,如果您希望这是奖励:)

于 2013-09-08T19:25:38.640 回答
0
use strict;
use warnings;
my ($x, $y);

($x, $y) = <> =~ m/([+-]?[0-9]+(?=[xy]))/g; #assuming x is always the first term

print "$x, $y\n";

对于更复杂的表达式,您也可以使用它。

use strict;
use warnings;

my (%number); #use a hash to store coeficcient and variables

my $expression = <>;

while ($expression =~ m/([+-]?[0-9]+)([a-z]+)/ig){
    $number{ $2 } += $1;
}

for my $variable (sort keys %number){
    print "$variable  has coeficcient $number{ $variable }\n";
于 2013-09-08T20:48:27.617 回答