簡體   English   中英

用於條件表達式的正則表達式

[英]Regex for conditional expressions

我需要一個可以將這樣的表達式划分為令牌的正則表達式:

(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糾正了正則表達式也不起作用(與上述結果相同)

編輯:正則表達式提供了作品,我在輸入中犯了一個愚蠢的錯誤。

您的表達中有幾個問題:

  • 您沒有轉義范圍運算符-在字符類[+-/*///^] ,可以將其寫為[+\\-/*^][-+/*^] (無需轉義)如果是第一個/最后一個)。
  • 您沒有逃脫| (||) ,應為(\\|\\|)
  • 您的數字表達式匹配空字符串,但您不希望這樣。

標記化時的一個技巧:如果有重疊,將最長的標記放在表達式的第一位。 <=放在[<=]之前,以獲得一個令牌而不是兩個令牌。

總之,您可以使用類似:

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

如果需要,可以用\\d+替換一些更復雜的數字(但不要匹配空字符串)。

您的模式有一些問題。

  1. 您正在使用| 作為交替。 因此,您可能無法使用| 也匹配文字管道(正則表達式引擎將如何區分?)。 因此,您需要轉義| 應該按字面意義進行匹配,或將其放在字符類中。

  2. 逃生是錯誤的方法。 您需要使用反斜杠\\而不是正斜杠/

  3. -在字符類中表示一個范圍,除非您將其作為第一個或最后一個字符。 在您的[+-...]角色類中,這是有問題的。 逃脫連字符或將其移至類中的第一個或最后一個位置。

  4. 您的第一個選擇(數字)允許空匹配,因為所有內容都是可選的。 這將為您提供大量您不想要的其他空結果。 刪除數字后的*

應用所有這些可以得到:

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

請注意,您不需要inside a character class (unless the(,, and ^進行轉義inside a character class (unless the ^`是第一個字符)。

還請注意,要將其寫為Java字符串,您需要將所有反斜杠加倍:

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

最后,如果您消除了所有不必要的括號,並可以使必要的括號不被捕獲,那么您可以對此進行很多優化(我也合並了字符類):

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

當然,除非您要使用捕獲來確定每個匹配項是哪種令牌,否則這僅適用。

工作演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM