【问题标题】:How do I make a regex match for measurement units?如何为测量单位进行正则表达式匹配?
【发布时间】:2011-01-06 16:11:48
【问题描述】:

我正在构建一个小型 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());
    }

}

【问题讨论】:

  • 你能贴出你用来查找匹配项的代码吗?
  • 问题是您没有将 / 作为允许的字符。您可以选择将其写为 ms^-2,通常可以有多个单位,而不仅仅是两个。
  • 我不希望它匹配“m/s^2”。我真的需要它为“m”和“s^2”单独匹配。这就是 do-while 循环在之后提取每个正则表达式匹配的原因。
  • 你需要使用find方法,而不是matches方法。
  • 我首先检查它是否匹配。如果是这样,我会一直阅读,直到找不到为止。

标签: java regex units-of-measurement


【解决方案1】:
([a-zA-Z]+)(?:\^(-?\d+))?

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 非常感谢您的帮助和耐心等待!
    【解决方案3】:

    试试

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

    【讨论】:

    • 谢谢,我已经添加了,实际上是故意的,因为我没有看到 - 在要匹配的字符串中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2011-10-18
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多