代码之家  ›  专栏  ›  技术社区  ›  Jordan Sitkin

如何在ColdFusion(或Java)中实现这个regex?

  •  4
  • Jordan Sitkin  · 技术社区  · 16 年前

    我发现 this very handy regular expression

    (?:(?:(?<Feet>\d+)[ ]*(?:'|ft)){0,1}[ ]*(?<Inches>\d*(?![/\w])){0,1}(?:[ ,\-]){0,1}(?<Fraction>(?<FracNum>\d*)\/(?<FracDem>\d*)){0,1}(?<Decimal>\.\d*){0,1}(?:\x22| in))|(?:(?<Feet>\d+)[ ]*(?:'|ft)[ ]*){1}
    

    我用他们的在线测试工具测试了它,它确实做了我需要的一切。将它作为参数粘贴到ColdFusion的REFind()中,可以预见,这样做不起作用,并且返回了一条无用的错误消息。

    编辑

    我需要使用regex中的组来提取数据,而不是简单地使用它来验证字符串。我想这意味着我应该使用REMatch()?请原谅我对regex缺乏经验!

    编辑2

    (?:(?:(\\d+)[ ]*(?:'|ft)){0,1}[ ]*(\\d*(?![/\\w])){0,1}(?:[ ,\\-]){0,1}((\\d*)\\/(\\d*)){0,1}(\\.\\d*){0,1}(?:\\x22| in))|(?:(\\d+)[ ]*(?:'|ft)[ ]*){1}
    

    找不到我提供的大多数测试数据的匹配项,包括使用regexlib.com测试人员: 1ft 2-3/4 in, 2' 3 4/5", 3ft, 4', 5 in, 6", 7.125 in, 3ft 4.5 in

    3 回复  |  直到 16 年前
        1
  •  4
  •   Boomerang Fish    16 年前

    这个?&ColdFusion不支持lt;foo>语法。我不熟悉这种语法,但它看起来像是用来为捕获的子表达式指定名称的。例如,第一个子表达式是表示脚的数字,所以它有?<Feet>标签。您可以删除这些标记而不影响正则表达式匹配的内容。

    我还没有测试过它,但是我在该regex中看到的所有其他元素在ColdFusion中都受支持,所以REFind()应该在删除所有元素之后工作?<foo>标签。当然,使用“returnsubexpressions”参数支持访问子表达式。请参阅REFind()上的标准CF文档。

    另外,正则表达式似乎有点冗长。{0,1}很罕见,是吗?意思是一样的。{1} 更为罕见,因为它是分组的默认值,因此可以完全忽略。

    附录

    regex = "(?:(?:(\\d+)[ ]*(?:'|ft)){0,1}[ ]*(\\d*(?![/\\w])){0,1}(?:[ ,\\-]){0,1}((\\d*)\\/(\\d*)){0,1}(\\.\\d*){0,1}(?:\\x22| in))|(?:(\\d+)[ ]*(?:'|ft)[ ]*){1}";
    subs = REFind(regex,input,1,"True");
    if (subs.pos[1] eq 0) {
      found = "False";
    } else {
      found = "True";
      feet = Mid(input,subs.pos[2],subs.len[2]);
      inches = Mid(input,subs.pos[3],subs.len[3]);
      fraction = Mid(input,subs.pos[4],subs.len[4]);
      fracNum = Mid(input,subs.pos[5],subs.len[5]);
      fracDem = Mid(input,subs.pos[6],subs.len[6]);
      decimal = Mid(input,subs.pos[7],subs.len[7]);
      if (feet is "") {
        // Use the _other_ feet
        feet = Mid(input,subs.pos[8],subs.len[8]);
      }
    }
    
        2
  •  1
  •   lins314159    16 年前

    似乎您使用的表达式是C#语法,它支持命名组(例如。 (?<Decimal>\.\d*) (?<Decimal>\.\\d*) 变成 (\.\\d*) ).

    Pattern.compile("(?:(?:(\\d+)[ ]*(?:'|ft)){0,1}[ ]*(\\d*(?![/\\w])){0,1}(?:[ ,\\-]){0,1}((\\d*)\\/(\\d*)){0,1}(\\.\\d*){0,1}(?:\\x22| in))|(?:(\\d+)[ ]*(?:'|ft)[ ]*){1}");
    
        3
  •  0
  •   rook    16 年前
    推荐文章