正则表达式 - 在句子中的单位指定符之前挑选一个数字

时间:2013-06-23 11:04:12

标签: java regex string

我有句子代表方向,我需要选择为这些方向指定的距离 - 只是数字。以下是示例:

"Head northwest on Lincoln St toward Warbuton Ave 0.1 mi" //0.1
"Head northwest on Middlefield Rd toward Embarcadero Rd 95 ft" //95
"Make a U-turn at Warbuton Ave 0.3 mi" //0.3
"Take the first right onto Embarcadero Rd 12.43 mi" //12.43

可能的单位说明符是“ft”和“mi”。数字本身通常是小数。挑选这些数字的正则表达式是什么?字符串中可能还有其他数字,但通常不是xy.zw mi形式。

我从\d*\.\d* mi开始,但如果可能的话,我希望能够在同一个表达式中检查ft。此外,我意识到,对于非十进制数字,这不起作用...需要使十进制和尾随数字可选我猜。

4 个答案:

答案 0 :(得分:3)

您可以使用以下正则表达式..

(\d+(.\d+)?) (mi|ft)

以下是一个示例.. ideone

修改 如评论中 Ingo 所示,更好的正则表达式将是......

(\d+(.\d+)?)\s*(mi|ft)\b

答案 1 :(得分:2)

可以在regular-expressions.info找到匹配浮点数的示例。

ftmi写为(ft|mi)

这些正则表达式的连接留给读者练习。

答案 2 :(得分:2)

您应该使用的模式是:

\d++(?:\.\d++)?(?=\s*+(?:mi|ft))

让我们来看看:

  • \d++正则表达式数字组匹配一次或多次,具体而言
  • (?:\.\d++)?一个点后跟一个可选的非捕获组中的上面(因此10匹配为10.11
  • (?=\s*+(?:mi|ft))对任意数量的空格进行前瞻性断言,后跟mift

这是Java中的一个例子:

public static void main(String[] args) throws ParseException {
    final String[] in = {"Head northwest on Lincoln St toward Warbuton Ave 0.1 mi",
        "Head northwest on Middlefield Rd toward Embarcadero Rd 95 ft",
        "Make a U-turn at Warbuton Ave 0.3 mi",
        "Take the first right onto Embarcadero Rd 12.43 mi"};
    final Pattern pattern = Pattern.compile("[0-9]++(?:\\.[0-9]++)?(?=\\s++(?:mi|ft))", Pattern.CASE_INSENSITIVE);
    for (final String s : in) {
        final Matcher m = pattern.matcher(s);
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

输出:

  

0.1
  95个
  0.3
  12.43

请注意Java代码中的双重转义。我还添加了CASE_INSENSITIVE标记,这是因为我们匹配所有排列,例如ft Ft FT等。

答案 3 :(得分:0)

试试这个

\d{1,2}(\.\d{1,2})?(?=\s(ft|mi))

这是working example

将此正则表达式转换为正在运行的Java正则表达式是一种练习。