使用正则表达式

时间:2019-03-21 13:10:44

标签: java regex

我必须对编程技术进行分配,而且我一直难以匹配多项式中的自由项(2.0x ^ 2 + 3.5x- 3.0 或45x + 2 ),以字符串形式给出。我尝试使用以下正则表达式:

(-{0,1}\d+(\.\d+){0,1})(?![0-9]\.*x\^\d))

我知道我的处理方式可能不太好,但是我没有太多时间以更复杂的方式来了解正则表达式,只是花了一点时间,而我就陷入了自己想要的问题只能获取格式为 ±#或±#。# 的数字,其后不跟随: x或x ^# ,其中 代表一个或多个数字。

2 个答案:

答案 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

Try it here


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
}