所以我认为我已经解决了它,我做了什么:
String pattern = "(<=|>=)\\s{0,2}((+]\\s{0,2})?(\\d+\\s{0,2}[/]\\s{0,2}(\\d{2,}|[1-9])\\s{0,2}|\\d+[.]\\d{1,2}|\\d+))\\s{0,2}";
模式有问题,我已在上面纠正过,现在它有效:)
我有一个不等式,可能包含&gt; =或&lt; =,一些空格和一个数字。这个数字可能是一个整数,一个十进制数字,带有2个小数位或一个分数,我想用&#34; Matcher&#34;来检索不等式的第二个成员上的数字。例如:
4x1 + 6x2 <= 40/3
我试图构建这样的模式,但我能够找到它。但后来我记得一小部分不能除以零,所以我想检查一下。为此,我使用了以下代码:
String inequation = "4x1 + 6x2 <= 40/3";
String pattern = "(<=|>=)\\s{0,2}((+]\\s{0,2})?(\\d+\\s{0,2}[/]\\s{0,2}(\\d{2,}|[1-9])\\s{0,2}\\d+|\\d+[.]\\d{1,2}|\\d+))\\s{0,2}";
Pattern ptrn = Pattern.compile(pattern);
Matcher match = ptrn.matcher(inequation);
if(match.find()){
String fraction = match.group(2);
System.out.println(fraction);
} else {
System.out.println("NO MATCH");
}
但它没有按预期工作。如果它在分母上至少有2位数,则它正确返回(例如40/32)。但如果它只有1位数,它只返回整数部分(例如40)。
无论如何要解决这个问题? 我应该使用哪种表达方式?
答案 0 :(得分:0)
您可以尝试使用debuggex来构建正则表达式。它会向您显示一个很好的表达式图表,您也可以测试您的输入。
Java实现(验证分子非零。):
Matcher m = Pattern.compile("[<>]=?\\s{0,2}([0-9]*(/[1-9][0-9]*)?)$").matcher("4x1 + 6x2 <= 40/3");
if (m.find()) {
System.out.println(m.group(1));
}
你的表达式末尾需要一个'$',以便它试图匹配整个不等式。
答案 1 :(得分:0)
您是否只想在不平等标志之后输入数字?然后做:
Matcher m = Pattern.compile("[<>]=?\\s*(.+?)\\s*$").matcher(string);
String number = m.find() ? m.group(1) : null;