2013-06-23 44 views
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(如果可能的話)。此外,我認識到,對於非十進制數字,這不起作用...我需要使小數點和結尾數字可選。

回答

2

的模式,你應該使用是:

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

讓我們通過它去:

  • \d++正則表達式數字組中的一個或更多次,possesively
  • (?:\.\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
0.3
12.43

注意在Java代碼的雙逃逸。我還添加了CASE_INSENSITIVE標誌,這是大家一致的所有排列,例如,ftFtFT

3

您可以使用下面的正則表達式。

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

下面是一個例子.. ideone

編輯 一個更好的正則表達式,如英戈在評論所說,將是..

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

爲了讓更多的防守,考慮'\ S *'替換空間。此外,我會在末尾添加一個單詞「\ b」,以便像「50分鐘」這樣的子字符串不會被匹配。 – Ingo

+0

@ Ingo-已更新,還有+1給你 – vidit

0

試試這個

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

這裏有一個working example

轉換這個正則表達式來運行一個Java正則表達式是留作練習。

+1

如果有100英尺外的東西,該怎麼辦? –

+0

OP的要求明確指出格式「xy.zw ft或mi」。 – Achrome

+1

我認爲這是說數字是浮點數,而不是總是兩位數。 –