[英]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+
替換一些更復雜的數字(但不要匹配空字符串)。
您的模式有一些問題。
您正在使用|
作為交替。 因此,您可能無法使用|
也匹配文字管道(正則表達式引擎將如何區分?)。 因此,您需要轉義|
應該按字面意義進行匹配,或將其放在字符類中。
逃生是錯誤的方法。 您需要使用反斜杠\\
而不是正斜杠/
。
-
在字符類中表示一個范圍,除非您將其作為第一個或最后一個字符。 在您的[+-...]
角色類中,這是有問題的。 逃脫連字符或將其移至類中的第一個或最后一個位置。
您的第一個選擇(數字)允許空匹配,因為所有內容都是可選的。 這將為您提供大量您不想要的其他空結果。 刪除數字后的*
。
應用所有這些可以得到:
[-]?[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.