2016-08-14 738 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