正则表达式组和总和

时间:2017-03-02 01:28:07

标签: regex

正则表达大师,

我不定期使用正则表达式,如果这是一个新手问题,请对不起。

我有这些示例字符串:

  1. "我有10辆车& 12辆卡车"
  2. "我们拥有2辆汽车& 1辆卡车"
  3. " 2辆汽车& 2辆卡车。"
  4. " 1辆汽车"
  5. " 1辆卡车"
  6. " 2辆汽车"
  7. " 2辆卡车"
  8. "我们有1个皮卡。另外2辆车& 1辆卡车。"
  9. "买了3辆轿车。另外10辆卡车& 10辆汽车"
  10. 我需要这个输出:

       car  truck
    1. 10   12
    2. 2    1
    3. 2    2
    4. 1    0
    5. 0    1
    6. 2    0
    7. 0    2
    8. 2    2   (Ford pickup is a type of truck)
    9. 13   10   (sedans is a type of car)
    

    数字可以是任何整数。可以在一个正则表达式中完成吗? 如果没有,在我的情况下,可以进行多次通过。语言并不重要,我对正则表达式模式更感兴趣。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

结合编程语言,您可以:

(?:(\d+)\s+(?:\bsedans?\b|\bcars?\b))|(?:(\d+)\s+(?:\bpickups?\b|\btrucks?\b))

Demo

这是一个用于演示的Perl脚本:

$ txt='"I have 10 cars & 12 trucks"
> "We own 2 cars & 1 truck"
> "2 cars & 2 trucks."
> "1 car"
> "1 truck"
> "2 cars"
> "2 trucks"
> "We have 1 pickup . Another 2 cars & 1 truck."
> "Bought 3 sedans. Another 10 trucks & 10 cars"'

$ echo "$txt" | perl -lne 'BEGIN{print "\tCars\tTrucks"}
                         $c+=$1 while(/(?:(\d+)\s+(?:\bsedans?\b|\bcars?\b))/g);
                         $t+=$1 while(/(?:(\d+)\s+(?:\bpickups?\b|\btrucks?\b))/g);
                         printf "%i\t%3i\t%10i\t%s\n", ++$i,$c,$t, $_;
                         $c=0; $t=0;'

打印:

    Cars    Trucks
1    10         12  "I have 10 cars & 12 trucks"
2     2          1  "We own 2 cars & 1 truck"
3     2          2  "2 cars & 2 trucks."
4     1          0  "1 car"
5     0          1  "1 truck"
6     2          0  "2 cars"
7     0          2  "2 trucks"
8     2          2  "We have 1 pickup . Another 2 cars & 1 truck."
9    13         10  "Bought 3 sedans. Another 10 trucks & 10 cars"