使用正则表达式提取在某些给定字符之前的整数

时间:2013-07-17 11:46:41

标签: java

我正在尝试编写一个函数,它将接受一个输入字符串并逐行读取它,我想要做的是在公制和英制之间转换测量单位。

显然,英里/公里和千克/磅之间的实际转换是简单的数学运算,但我对于提取这些整数的正确方法感到有点难过,所以我可以转换它们。

为了使事情变得更加困难,输入会有所不同,我需要识别不同的格式(整数和测量单位之间的空格,不同的拼写[英里,英里,英里,公里,公里等])< / p>

现在我有了

if (isMetric) {
            for (String line : input.split("[\\r\\n]+")) {

            }
            return input;
        }

要读取每一行,我想我可能需要使用String.substring和Regex的组合,但我很新。

非常感谢任何形式的指导或有用文章的链接,我当然不是在寻找一个直接的解决方案!

非常感谢!

编辑:

例如你问:

输入:

I ran 50miles today, 1mile yesterday, and I also lifted a 20 pound and a 5lb weight!

输出:

I ran 80km today, 1.6km yesterday, and I also lifted a 9kg and a 2.2kg weight!

1 个答案:

答案 0 :(得分:2)

这是一个解决方案,可让您找到包含或不包含空格以及不同单位拼写的所有匹配。

请注意,在模式中,所有具有前缀的单位都必须在其前缀之前(因此,miles必须在mil之前)。

// \d+ matches a number. \s* matches any number of spaces.
String milePattern = "(\\d+)\\s*((miles)|(mile)|(mil))";
String kmPattern = "(\\d+)\\s*((kilometers)|(km)|(kilometres))";

// Compile the patterns (you should not do that at each method call, in your real code)
Pattern mileP = Pattern.compile(milePattern);
Pattern kmP = Pattern.compile(kmPattern);

// You can match one or multiple lines all the same.
String input = "I ran 1001km or 601 mile \n that is the same as 602 mil or 603miles or 1002 kilometers.";

// Create matcher instance on your input.
Matcher mileM = mileP.matcher(input);
// Iterate over all mile-matches (find will 'advance' each time you call it)
while (mileM.find()) {
    // Retrieve the value and the unit
    String amount = mileM.group(1);
    String unit = mileM.group(2);

    // You can also access some data about the match
    int idx = mileM.start();

    // And do whatever you need with it
    System.out.println("Found a mile value: " + amount + " with unit " + unit + " starting at index: " + idx);
}

你可以像对待里程那样做,但是用公里模式。如果需要,您还可以组合两个表达式。在我的测试用例中,我得到了输出:

Found a mile value: 601 with unit mile starting at index: 16
Found a mile value: 602 with unit mil starting at index: 47
Found a mile value: 603 with unit miles starting at index: 58
Found a km value: 1001 with unit km starting at index: 6
Found a km value: 1002 with unit kilometers starting at index: 70

然后,您可以执行任何所需的转换,或者使用其他单位重建字符串。