如何为测量单位进行正则表达式匹配?

时间:2010-01-19 05:39:20

标签: java regex units-of-measurement

我正在构建一个小型Java库,它必须匹配字符串中的单元。例如,如果我有“300000000 m / s ^ 2”,我希望它与“m”和“s ^ 2”匹配。

到目前为止,我已经尝试了大多数可以想象的(由我)配置(我希望这是一个好的开始)

"[[a-zA-Z]+[\\^[\\-]?[0-9]+]?]+"

为了澄清,我需要一些与letters[^[-]numbers]匹配的东西(其中[]表示非强制性部分)。这意味着:字母,可能后跟一个可能为负的指数。

我已经研究过正则表达式了,但我真的不能流利,所以任何帮助都会非常感激!

非常感谢,

修改 我刚刚尝试了前3个回复

String regex1 = "([a-zA-Z]+)(?:\\^(-?\\d+))?";
String regex2 = "[a-zA-Z]+(\\^-?[0-9]+)?";
String regex3 = "[a-zA-Z]+(?:\\^-?[0-9]+)?";

它不起作用......我知道测试模式的代码是有效的,因为如果我尝试一些简单的东西,比如匹配“12345”中的“[0-9] +”,它将匹配整个字符串。所以,我没有得到什么仍然是错的。我正在尝试在需要的地方更改括号括号...

用于测试的代码:

public static void main(String[] args) {
    String input = "30000 m/s^2";

//    String input = "35345";

    String regex1 = "([a-zA-Z]+)(?:\\^(-?\\d+))?";
    String regex2 = "[a-zA-Z]+(\\^-?[0-9]+)?";
    String regex3 = "[a-zA-Z]+(?:\\^-?[0-9]+)?";
    String regex10 = "[0-9]+";
    String regex = "([a-zA-Z]+)(?:\\^\\-?[0-9]+)?";
    Pattern pattern = Pattern.compile(regex3);
    Matcher matcher = pattern.matcher(input);

    if (matcher.matches()) {
        System.out.println("MATCHES");
        do {
            int start = matcher.start();
            int end = matcher.end();
//            System.out.println(start + " " + end);
            System.out.println(input.substring(start, end));
        } while (matcher.find());
    }

}

3 个答案:

答案 0 :(得分:2)

([a-zA-Z]+)(?:\^(-?\d+))?

如果您匹配单个字符,则无需使用字符类[ ... ]( ... )这里是一个捕获括号,供您稍后提取单位和指数。 (?: ... )是非捕获分组。

答案 1 :(得分:0)

您混合使用方括号来表示字符类和花括号来分组。试试这个:

[a-zA-Z]+(\^-?[0-9]+)?

在许多正则表达式方言中,您可以使用\ d表示任何数字而不是[0-9]。

答案 2 :(得分:0)

尝试

"[a-zA-Z]+(?:\\^-?[0-9]+)?"