在正则表达式中无法正确识别带正斜杠(/)的模式

时间:2016-08-14 03:07:29

标签: java regex

我有一些带有glucose信息的字符串及其对应的值。例如,一个样本字符串是“FINGER BLOOD GLUCOSE 156两小时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.",测试失败。我相信这是因为正斜杠“/”的事实。

如何改善正则表达式以正常工作?

2 个答案:

答案 0 :(得分:2)

你的正则表达式正在寻找一个数字,然后是空格,数字,然后是点或逗号,后跟另一个数字。在它不匹配的情况下,因为数字后面没有空格,逗号后面没有数字。

如果您希望匹配,则需要将正则表达式更新为... "(\\d+(\\.|,)\\d*)|(\\s\\d+(\\s|$))"

答案 1 :(得分:0)

我绝对同意来自@ user4504267和@Wernsey的答案,因为278之后的逗号导致|或运算符的第二部分不匹配。但您还应该仔细检查是否希望glucose成为比赛的一部分。正如你所知,Glucose.*?(\d+(\.|,)\d+)|(\s\d+(\s|$))的正则表达式与glucose 278中的Labs showed normal anion gap, glucose 278 u/a w/ 1+ ketones.相匹配,但它在Labs showed normal anion gap, 278 u/a w/ 1+ ketones.

中仅匹配278

这是因为|之前的第一个选项匹配“葡萄糖然后是一组带有单个句号或逗号的数字”,第二个部分匹配“空格后跟一组数字”通过空间或线端“。我怀疑你总是希望先匹配葡萄糖,然后再匹配数值。

我建议在https://regex101.com/这样的网站上迭代和测试你的正则表达式,以及编写java单元测试。您应该能够弄清楚如何调整正则表达式以匹配并准确捕获您想要的此类网站。