代码之家  ›  专栏  ›  技术社区  ›  OMG_peanuts

Perl的RegExp语法

  •  0
  • OMG_peanuts  · 技术社区  · 15 年前

    下一行你如何分解(或不分解)?

    if ($Hour =~ /^(\d{2})(\d{2})(\d{2})$/) { $result = "$1:$2:$3" }
    
    4 回复  |  直到 15 年前
        1
  •  3
  •   Chas. Owens    15 年前

    首先,不要使用 \d 除非要匹配所有Unicode数字字符(例如或᠕)。如果你想从零到九匹配,你必须说 [0-9] .

    不幸的是,你不能把它缩短到

    if ($Hour =~ /^([0-9]{2}){3}$/) { $result = "$1:$2:$3" }
    

    因为你关心所有的比赛,这只会挽救最后一场。同样地

    if ($Hour =~ /^([0-9]{6})$/) { $result = "$1:$2:$3" }
    

    出局了。你可以说

    ($result = $Hour) =~ s/([0-9]{2})(?!$)/$1:/g;
    

    但你会用一个稍微短一点的线来交换透明度。

        2
  •  3
  •   Alex Brown    15 年前

    对我来说,看起来很不错。

    你可以更换每一个 {2} 和另一个 \d 如果你愿意的话。

    你可以用 $result=join":",$Hour=~/^(\d\d)/g 但它没有那么严格-它将匹配行开头的任何偶数长度的数字字符串。

        3
  •  1
  •   ysth    15 年前

    我会用 \z 而不是 $ ,除非您确实希望允许可选的尾随换行符。除此之外(以及变量大小写不一致),没关系。

        4
  •  1
  •   Fredrik Pihl    15 年前

    看起来不错。匹配一个时间可以采取不同的严格程度。 上面的内容允许 999999

    另一种匹配24小时制时钟的方法是

    ([01]?[4-9]|[012]?[0-3])
    

    一小时后

    [0-5][0-9]
    

    几分钟。

    或者(为了好玩),小时部分也可以使用

    ([01]?[0-9]|2[0-3])