2016-08-14 176 views
-2

我有一些字符串,其中包含glucose信息及其相應的值。例如,一個樣本串是「FINGER BLOOD GLUCOSE 1562小時PP」和我有在Java中下面的程序,在正則表達式中使用正斜槓(/)無法正確識別

public class GlucosePattern{ 


    // test string 
    private static String case1 = "FINGER BLOOD GLUCOSE 156 two hours PP"; 

    private static final String decimalValue = "(\\d+(\\.|,)\\d+)|(\\s\\d+(\\s|$))"; 
    private static final String glucose = "Glucose.*?"; 
    private static final Pattern COMPILED_PATTERN = Pattern.compile(glucose+ decimalValue, 
      Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 


    public Matcher find(final String text) { 

     return pattern.matcher(text); 
    } 

} 



// the test of the program 
@Test 
public void findWithCase1ShouldFindPattern() throws Exception { 

    assertTrue(new GlucosePattern().find(case1).find()); 
} 

所提供的測試返回true但是,當我使用的一些其他字符串,比方說,"Labs showed normal anion gap, glucose 278, u/a w/ 1+ ketones."的測試失敗。我相信這是由於正斜槓「/」的事實而發生的。

如何提高正則表達式正常工作?

+0

這是導致問題的278之後的逗號。這部分正則表達式'(\\。|,)\\ d +'期望逗號後面至少有1位數字,而另一部分'(\\ s \\ d +(\\ s | $))'的正則表達式期望數字後面跟着空格。 – Wernsey

+0

是的,這是解決的,我接受它作爲答案。 – Chaklader

回答

2

你的正則表達式正在尋找一個數字,然後是一個空格,或一個數字,然後是一個點或一個逗號,然後是另一個數字。在它不匹配的情況下,因爲數字後沒有空格,逗號後面沒有數字。

如果你想讓它匹配

,你需要更新你的正則表達式來像.. "(\\d+(\\.|,)\\d*)|(\\s\\d+(\\s|$))"

+0

這有助於很多。 – Chaklader

0

我肯定來自@ user4504267和@Wernsey的答案一致,在278後的逗號引起|的第二部分或運營商不匹配。但你也應該仔細檢查你是否想讓glucose成爲比賽的一部分。當你擁有它的Glucose.*?(\d+(\.|,)\d+)|(\s\d+(\s|$))正則表達式匹配Labs showed normal anion gap, glucose 278 u/a w/ 1+ ketones.glucose 278但它也將匹配只需278 Labs showed normal anion gap, 278 u/a w/ 1+ ketones.

這是因爲|前的第一個選項是在「葡萄糖匹配,然後一組數字,在單週期或逗號在其中「,第二部分是匹配」一個空格後跟一組數字,後跟空格或行結束「。我懷疑你在匹配數字值之前總是希望匹配葡萄糖。

我建議在像https://regex101.com/這樣的站點上迭代和測試你的正則表達式以及編寫java單元測試。你應該能夠弄清楚如何調整你的正則表達式來匹配和捕獲你想要的這樣的網站。

+0

的確如此,我想首先匹配「葡萄糖」,如果不是這樣,我會尋找第二部分。如何在這種情況下改進正則表達式?順便說一下,這裏指出這很有幫助。 – Chaklader