Perl - 使用正则表达式在数组中格式化字符串

时间:2013-07-21 17:19:17

标签: regex arrays perl formatting

我有一个代表大小的字符串数组。

所有格式变体的列表如下:

  1. 2×3
  2. 3.6x5.6
  3. 6'RD
  4. 目标:转换为以下格式:

    1. 2'x 3'
    2. 3'6''x 5'6''
    3. 6'ROUND
    4. 目前正在将所有值推送到名为@sizearray的数组中,如下所示:

      push(@sizearray, $data[$size_num]);
      

      然后,

      my @formattedsize = @sizearray;
      
      foreach (@formattedsize) {
      
          if ($formattedsize[$_] =~ /(\d+)x(\d+)/) {
      
              #convert to
      
          if (???) {
      
              #???
      
          }
      
          if (???) {
      
              #???
      
          }
      
      }
      

      如何浏览数组中的每个元素并使用新格式将值保存到新数组中?

1 个答案:

答案 0 :(得分:1)

您正试图解决2个问题:

  1. 解析输入以提取“有意义”的数据,即几何(矩形,圆形等)和参数(纵横比,直径等)。在你能做到这一点之前,你必须建立可能性的“宇宙”。有不只是矩形和圆形?这是更难的部分。
  2. 获取提取的数据并标准化/标准化格式。这是容易的部分
  3. 假设您只有两个选项,矩形和圆形。矩形似乎是由一对以'x'分隔的实数定义的,因此正则表达式可能是

    (\d+(?:\.\d+)?)\s*x\s*(\d+(?:\.\d+)?)
    

    这里有两个实数的表达式:

    • 一个或多个数字后跟一个点和一个或多个数字的可选组
    • 可选空格,x和更多可选空格
    • 一个或多个数字后跟一个点和一个或多个数字的可选组

    数字表达式周围的外括号是一个捕获组,它使正则表达式引擎在结果中进行任何匹配。内括号(?:\.\d+)?是非捕获组(?:部分)。它允许您将尾随?量词(0或1)应用于小数部分,但不能单独捕获它。

    如果输入与此不匹配,则转到下一个模式,寻找圆形规格。根据需要重复所有可能性。

    对于上面的表达

    # assume string to be parsed is in $_
    if (my ($h,$w) = /(\d+(?:\.\d+)?)\s*x\s*(\d+(?:\.\d+)?)/))
    {
        printf "%s x %s\n", $h, $w;
    }
    

    我没有对此进行过测试,因此可能存在拼写错误......但这是一般性的想法。