我必须对编程技术进行分配,而且我一直难以匹配多项式中的自由项(2.0x ^ 2 + 3.5x- 3.0 或45x + 2 ),以字符串形式给出。我尝试使用以下正则表达式:
(-{0,1}\d+(\.\d+){0,1})(?![0-9]\.*x\^\d))
我知道我的处理方式可能不太好,但是我没有太多时间以更复杂的方式来了解正则表达式,只是花了一点时间,而我就陷入了自己想要的问题只能获取格式为 ±#或±#。# 的数字,其后不跟随: x或x ^# ,其中 # 代表一个或多个数字。
答案 0 :(得分:0)
完整的正则表达式解决方案:
(?<!\^)[-+]?\d+(\.\d+)?(?=$|[-+])
(?<!\^)
,则^
将不匹配[-+]?
将匹配一个可选的符号字符\d+(\.\d+)?
将匹配由整数部分和可选的浮动部分组成的数字(?=$|[-+])
将不匹配,除非紧随其后的是符号字符或字符串的结尾您可以here试试。
具有术语匹配的Java解决方案:
Pattern termPattern = Pattern.compile("\\d+(?:\\.\\d+)?(x(?:\\^\\d+)?)?");
Matcher termMatcher = termPattern.matcher(input);
while (termMatcher.find()) {
if (termMatcher.group(1) == null) {
// you have a free term
}
}
正则表达式匹配一个整数部分,后跟一个可选的浮动部分,然后匹配一个可选的x^n
部分,该部分在捕获组中被捕获。通过将模式应用于输入来创建Matcher
。调用Matcher.find
使我们可以迭代输入字符串上的多个匹配项。对于每个匹配项,我们都会检查第一个捕获组的内容,如果为空,则有一个免费术语。
您可以here试试。
另一种解决方案是简单地在[+-]
周围拆分字符串,并针对每个部分测试其是否包含x
。
答案 1 :(得分:0)
这可以做到:(?<!\^)(\d+(?:\.\d+)?)(?![x.\d])
(?<! | Negative lookbehind:
\^ | A literal "^"
) | Close group
( | Capture the following:
\d+ | Match one or more digits
(?: | Match the following group:
\. | A literal "."
\d+ | One or more digits
)? | Close group, optional match
) | End capture
(?! | Negative lookahead:
[x.\d] | Either an "x", ".", or any digit
) | Close group
String s = "5x-50.1+x^2-2+20x";
Pattern p = Pattern.compile("(?<!\\^)(\\d+(?:\\.\\d+)?)(?![x.\\d])");
Matcher m = p.matcher(s);
if (m.find()){
System.out.println(m.group(1)); // Output: 50.1
}