Java 如何使正则表达式与度量单位匹配?

Java 如何使正则表达式与度量单位匹配?,java,regex,units-of-measurement,Java,Regex,Units Of Measurement,我正在构建一个小型Java库,它必须匹配字符串中的单位。例如,如果我有“300000000 m/s^2”,我希望它与“m”和“s^2”匹配 到目前为止,我已经尝试了(我所能想象的)最相似的配置(我希望这是一个好的开始) 为了澄清,我需要一些匹配字母[^[-]数字](其中[]表示非强制性部分)的内容。这意味着:字母,后面可能跟一个可能是负数的指数 我学过一点正则表达式,但我真的不太流利,所以任何帮助都将不胜感激 多谢各位 编辑: 我刚刚尝试了前3个回复 String regex1 = "([a-z

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

到目前为止,我已经尝试了(我所能想象的)最相似的配置(我希望这是一个好的开始)

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

我学过一点正则表达式,但我真的不太流利,所以任何帮助都将不胜感激

多谢各位

编辑: 我刚刚尝试了前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());
    }

}

如果要匹配单个字符,则不需要使用character类
[
..
]
<代码>(…
这是一个捕获括号,供您稍后提取单位和指数
(?:
是非捕获分组。

您混合使用方括号表示字符类和花括号进行分组。请尝试以下方法:

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

试试看

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

谢谢,我补充说,实际上这是故意的,因为我看不到-在Match的字符串中,你可以发布你用来查找匹配项的代码吗?问题是你没有将/包括在允许的字符中。您可以选择将其写为ms^-2,一般来说,您可以有多个单元,而不仅仅是两个。我不希望它与“m/s^2”匹配。我真的需要它对“m”和“s^2”进行单独的匹配。这就是do-while循环的原因,该循环随后提取每个正则表达式匹配项。您需要使用
find
方法,而不是
matches
方法。我首先检查它是否匹配。如果是这样的话,我会一直读到找不到为止。非常感谢你的帮助和耐心!
[a-zA-Z]+(\^-?[0-9]+)?
"[a-zA-Z]+(?:\\^-?[0-9]+)?"