Java正则表达式 - 在String中的特定单位之前提取所有浮点数

时间:2017-01-16 09:58:28

标签: java regex

我是java正则表达式的新手。我想知道如何在%之前提取数字或浮点数。例如:

"Titi 10% Toto and tutu equals 20X"
"Titi 10.50% Toto and tutu equals 20X"
"Titi 10-10.50% Toto and tutu equals 20X
"Titi 10sd50 % Toto and tutu equals 20X
"Titi 10-10.50% or 10sd50 % Toto and tutu equals 20X

输出:

10
10.50
10-10.50
10sd50
10-10.50;10sd50

我的想法是在"space + number(% or space%)"之前和之后替换所有;,以便在%之前提取所有值或组值。我尝试使用它:replaceAll("[^0-9.]+|\\.(?!\\d)(?!\\b)\\%",";"); = NO SUCCESS

我该怎么做?

2 个答案:

答案 0 :(得分:2)

这个应该做的工作:

((?:\d+(?:+|-|sd))?\d+(?:\.\d+)\h*%)

<强>解释

(               : start group 1
  (?:           : start non capture group
    \d+         : 1 or more digits
    (?:+|-|sd)  : non capture group that contains + or - or sd
  )?            : end group
  \d+           : 1 or more digits
  (?:           : start non capture group
    \.          : a dot
    \d+         : 1 or more digits
  )             : end group
  \h*           : 0 or more horizontal spaces
  %             : character %
)               : end of group 1

结果将在第1组。

在java中你必须双重逃避,为了便于阅读,我在这里没有这么做。

答案 1 :(得分:1)

您可以执行以下操作:

  • 首先找到每个字符串中的所有匹配项
  • 将每个匹配元素的最后一个字符(%)替换为空白
  • 按照您自己的格式进行操作。

给出了一个java样本:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {
        final String regex = "\\d+(\\.?\\d+)?(\\+|\\-|sd)?(\\d+(\\.?\\d+)?)?[ ]*%";
        final String test_str = "\"Titi 10% Toto and tutu equals 20X\"\n"
                + "\"Titi 10.50% Toto and tutu equals 20X\"\n"
                + "\"Titi 10-10.50% Toto and tutu equals 20X\n"
                + "\"Titi 10sd50 % Toto and tutu equals 20X\n"
                + "\"Titi 10-10.50% or 10sd50 % Toto and tutu equals 20X";

        final Pattern pattern = Pattern.compile(regex);
        for(String data : test_str.split("\\r?\\n")) {
            Matcher matcher = pattern.matcher(data);
            while (matcher.find()) {
                System.out.print(data.substring(matcher.start(), matcher.end()-1) + " ") ;
            }
            System.out.println();
        }
    }
}

上面的代码给出了:

10 
10.50 
10-10.50 
10sd50  
10-10.50 10sd50 

您可以对这些数据执行任何操作。 您可以看到解释:Regex101