【问题标题】:Regex for conditional expressions条件表达式的正则表达式
【发布时间】:2013-06-11 10:46:13
【问题描述】:

我需要一个正则表达式,可以将这样的表达式划分为标记:

(6<=5) || (8+1)^2 >= 3 && 4 == 2   

结果应该是这样的列表:

(, 6, <=, 5, ), ||, (, 8, +, 1, ), ^, 2, >=, 3, &&, 4, ==, 2

我做了这个,但它不起作用,它给了我这个结果:

[(, 6, 5, ), (, 8, +, 1, ), ^, 2, 3, 4, 2]

这是正则表达式:

[-]?[0-9]*+([eE][-]?[0-9]+)?|([+-/*///^])|([/(/)])|(>=)|(<=)|(&&)|(==)|(||)

它可以识别数字和算术符号,但它不适用于条件符号(&&、==、||、=)。

你知道怎么改吗?

编辑:这是代码:

public void convertToList() {
    String regex = "[-]?[0-9]+([eE][-]?[0-9]+)?|([-+/*\\\\^])|([()])|(>=)|(<=)|(&&)|(==)|([|][|])";
    Matcher m3 = Pattern.compile(regex).matcher(this.stringExp);
    this.arrayExp = new ArrayList<String>(this.stringExp.length());
    while (m3.find()) {
        this.arrayExp.add(m3.group());
    }
}

但即使使用 m.butter 更正的正则表达式,它也不起作用(与上面的结果相同)

编辑:提供的正则表达式有效,我在输入时犯了一个愚蠢的错误。

【问题讨论】:

  • 您在哪种语言或环境中使用它?
  • 始终将此信息包含在与正则表达式相关的问题中。

标签: java regex expression


【解决方案1】:

你的表达有几个问题:

  • 你没有对字符类[+-/*///^]中的范围运算符-进行转义,它可以写成[+\-/*^][-+/*^](第一个/最后一个都不需要转义)。
  • 你没有逃脱(||)中的|,应该是(\|\|)
  • 您的数字表达式与空字符串匹配,您不希望这样。

标记化时的另一个提示:在表达式中将最长的标记放在首位,以防重叠。将&lt;= 放在[&lt;=] 之前以获得一个令牌而不是两个。

总而言之,你可以使用类似的东西:

\d+|[<>=]=|&&|\|\||[-+*/^()]

如果您愿意,请将 \d+ 替换为更复杂的数字(但不要匹配空字符串)。

【讨论】:

    【解决方案2】:

    您的模式存在一些问题。

    1. 您正在使用| 作为替代。因此,您也不可能使用| 来匹配文字管道(正则表达式引擎如何区分?)。因此,您需要将应该与字面匹配的| 转义,或者将其放入字符类中。

    2. 你的逃生方式是错误的。您需要使用反斜杠 \ 而不是正斜杠 /

    3. - 在字符类中表示一个范围,除非您将其作为第一个或最后一个字符。这在您的 [+-...] 字符类中是有问题的。转义连字符或将其移动到类中的第一个或最后一个位置。

    4. 您的第一个选择(数字)允许空匹配,因为一切都是可选的。这会给你一大堆你不想要的额外空结果。去掉数字后面的*

    应用所有这些给出:

    [-]?[0-9]+([eE][-]?[0-9]+)?|([-+/*\\^])|([()])|(>=)|(<=)|(&&)|(==)|([|][|])
    

    注意,(,), and^inside a character class (unless the^` 是第一个字符不需要转义。

    另请注意,要将其编写为 Java 字符串,您需要将所有反斜杠加倍:

    str = "[-]?[0-9]+([eE][-]?[0-9]+)?|([-+/*\\\\^])|([()])|(>=)|(<=)|(&&)|(==)|([|][|])"
    

    最后,如果你去掉所有不必要的括号,并使必要的括号不被捕获(我还合并了字符类),你可以对此进行很多优化:

    str = "[-]?[0-9]+(?:[eE][-]?[0-9]+)?|[-+/*\\\\^()]|>=|<=|&&|==|[|][|]"
    

    当然,这仅在您想使用捕获来确定每个匹配项是哪种标记时才有效。

    Working demo

    【讨论】:

    • 我已经对问题进行了编辑,我已将您的正则表达式复制粘贴到上面的代码中,但结果是一样的。
    • @AR89 它对我来说非常好用:ideone.com/dqQWPR ... 必须有其他问题,无论是您的输入字符串还是显示结果的方式
    猜你喜欢
    • 2016-09-19
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多