1

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

"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

4 回答 4

3

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

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

这是一个例子.. ideone

编辑正如Ingo在评论 中建议的那样,一个更好的正则表达式将是..

(\d+(.\d+)?)\s*(mi|ft)\b
于 2013-06-23T11:09:54.503 回答
2

您应该使用的模式是:

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

让我们来看看:

  • \d++正则表达式数字组匹配一次或多次,可能
  • (?:\.\d++)?一个点后跟一个可选的非捕获组中的上述内容(因此 10 将与 10.11 匹配
  • (?=\s*+(?:mi|ft))任何数量的空格的前瞻断言,后跟miorft

这是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等的所有排列。

于 2013-06-23T11:16:24.053 回答
2

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

ftmi写为(ft|mi)

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

于 2013-06-23T11:08:46.250 回答
0

尝试这个

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

这是一个工作示例

将此正则表达式转换为有效的 Java 正则表达式留作练习。

于 2013-06-23T11:14:50.300 回答