【问题标题】:Regular Expression to find $0.00正则表达式查找 $0.00
【发布时间】:2016-07-29 21:54:09
【问题描述】:

需要统计字符串中“$0.00”的个数。我正在使用:

my $zeroDollarCount = ("\Q$menu\E" =~ tr/\$0\.00//);

但它不起作用。问题是$ 标志正在抛出正则表达式。如果我只想计算$ 的数量,但找不到$0.00。

这是怎么复制的?您的解决方案没有解决对我来说是个问题的美元符号。

【问题讨论】:

  • $ 把它扔掉了。您的链接没有解决这个问题。
  • 确实如此。我仍然认为它不是重复的。我正在发布一个答案,解释你做错了什么。
  • 我无法让它工作,已经尝试了 3 天。

标签: regex perl


【解决方案1】:

您正在使用音译运算符 tr///。这与模式没有任何关系。您需要 match 运算符 m//。并且因为您希望它找到所有出现的模式,请使用 /g 修饰符。

my $count = () = $menu =~ m/\$0\.00/g;

如果我们运行这个程序,输出是2。

use strict;
use warnings;

my $menu = '$0.00 and $0.00';
my $count = () = $menu =~ m/\$0\.00/g;

print $count;

现在让我们来看看发生了什么。首先,匹配的模式。

/\$0\.00/

这是相当直截了当的。有一个文字 $,我们需要用反斜杠 \ 转义它。零后跟一个文字点.,我们需要再次对其进行转义,因为与$ 一样,它在正则表达式中具有特殊含义。

my $count = () = $menu =~ m/\$0\.00/g;

这整行看起来很奇怪。我们可以将其分成几行以使其更具可读性。

my @matches = ( $menu =~ m/\$0\.00/g );
my $count = scalar @matches;

我们需要/g 开关打开正则表达式匹配以使其匹配所有匹配项。在列表上下文中,匹配操作返回所有匹配项(这将是字符串"$0.00" 多次)。因为我们想要计数,所以我们将其强制到scalar 上下文中,这给了我们元素的数量。用上面的成语可以把它缩短为一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多