我如何在ColdFusion(或Java)中实现这个正则表达式?

时间:2010-09-09 03:59:25

标签: java regex coldfusion

我在regexlib.com上找到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()可预测地不起作用并返回无用的错误消息。

我在ColdFusion工作,所以如果需要,我可以访问Java类。 Java或ColdFusion中的答案都会有所帮助。

一个好的样本字符串就像:5'1 / 2“

修改

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

编辑2

似乎将REFind()与此表达式一起使用:

(?:(?:(\\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 个答案:

答案 0 :(得分:4)

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

我还没有对它进行过测试,但我在ColdFusion中支持我在该正则表达式中看到的所有其他元素,因此REFind()应该在删除所有的后才能工作?&lt; foo&gt;标签。当然,使用“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]);
  }
}

答案 1 :(得分:1)

看起来像你在C#语法中使用的表达式,它支持命名组(例如(?<Decimal>\.\d*))。 Java没有,并将它们视为完全不同的东西。由于不使用命名组,只需删除命名部分(例如(?<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}");

答案 2 :(得分:0)

Java的String object支持正则表达式。 Sting.match(),String.replaceAll()和String.replaceFirst()。