正则表达式检测包含权重

时间:2016-06-09 21:15:46

标签: java regex

我难以正确使用正则表达式。

我用这个链接来检测体重: regex to get weight

这个词只能找到重量,有效:

([\d.]+)\s+(lbs?|oz|g|kg)

我写了一个java方法来在html页面上为药物剂量着色。如果它包含至少一个重量指示,它应该为括号中的所有文本着色。 (例如低于18:5.5mg,超过18:10mg) 目前它有时会为正确的部分着色,但大多数情况下正则表达式会变得很多或忽略一个括号,它应该是彩色的。

当前问题:正则表达式还包含结束括号后的每个单词,直到行结束。

这是我现在的正则表达式:

。?

(适用\([^ \( \ d \,\ d +)\ S +(微克|?毫克| G |千克)* \)<。 /强>

这里是整个方法:

private static String addDosageHighlight(String htmltext) {

    String dosage ="";
    Pattern pattern = Pattern.compile("(\\(.[^\\(]*.\\d*\\,?\\d+)\\s?+(µg|mg|g|kg).*.\\)");
    Matcher matcher = pattern.matcher(htmltext);
    // Check all occurrences
    if (matcher.find()) {
        dosage = matcher.group();
        htmltext = htmltext.replace(dosage, "<span style=\"color:magenta;\">" + dosage +"</span>"); 
    }   
    return htmltext;
}

示例: 药物b(18:10克,超过18:15克)效果很好

药物c(如果需要,有时15克)可以帮助

(有时10克)

所有这些都被检测到,但会将所有文本着色到括号后的行尾。我无法得到一个不会被染色的括号,这应该是好的。

2 个答案:

答案 0 :(得分:1)

您没有指定是否接受小数,但是从正则表达式中,我假设您允许使用逗号作为小数点的十进制数。

所以,我相信这个正则表达式会做你想要的:

"\\([^\\)]*\\d+(,\\d+)?\\s*(µg|mg|g|kg)[^\\)]*\\)"

答案 1 :(得分:0)

在你的正则表达式中,你的.*过于贪婪,想吃尽可能多的角色。相反,你可以使用像[^)]*这样的东西,它会尝试匹配所有不是)符号的字符。