我在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
答案 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()。