我是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
我该怎么做?
答案 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