我有句子代表方向,我需要选择为这些方向指定的距离 - 只是数字。以下是示例:
"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
。此外,我意识到,对于非十进制数字,这不起作用...需要使十进制和尾随数字可选我猜。
答案 0 :(得分:3)
您可以使用以下正则表达式..
(\d+(.\d+)?) (mi|ft)
以下是一个示例.. ideone
修改强> 如评论中 Ingo 所示,更好的正则表达式将是......
(\d+(.\d+)?)\s*(mi|ft)\b
答案 1 :(得分:2)
答案 2 :(得分:2)
您应该使用的模式是:
\d++(?:\.\d++)?(?=\s*+(?:mi|ft))
让我们来看看:
\d++
正则表达式数字组匹配一次或多次,具体而言(?:\.\d++)?
一个点后跟一个可选的非捕获组中的上面(因此10匹配为10.11 (?=\s*+(?:mi|ft))
对任意数量的空格进行前瞻性断言,后跟mi
或ft
这是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)