[英]How can I match valid sequence of operation using Regular Expression in Java
我剛開始用 Java 學習正則表達式。 我有這個來自hyperskill.com的項目,稱為“智能計算器”,它就像 Python 解釋器,您可以在其中輸入算術運算,當您按下回車鍵時,會出現 Z78E6221F6393D1356681DB398Z1。
如果輸入像2 + 2 - 3
一樣有效,我想匹配,如果輸入是2 + 2 -
+ 2 - 則不匹配。
我有這些正則表達式(\s*[0-9]+\s*[\+\-\*\/]+\s*[0-9]+\s*){1,}
但是當我嘗試使用一些輸入進行測試時......
[In] 1 + 1
[Out] Matched
[In] 1 + 1 + 1 // Not matched
[Out] Not Matched
[In] 1 + 12 + 1 //But this one matched
[Out] Matched
[az]
是正則表達式:a 和 z 之間的任何字符。 因此,您的[+-*/]
是正則表達式:“任何在+
的代碼點值和*
的代碼點值之間具有 unicode 代碼點值的字符都有問題。嘗試將-
放在開頭或結尾,在這種情況下它的字面意思是-
字符,或者轉義它。所以,這樣寫: [-+*/]
。
其次,您的正則表達式適用於:
然后您將 state 視為:這,至少一次或多次(注意{1,}
只是一種愚蠢的寫作方式+
!
因此,您已經設置了正則表達式以查找例如:
中間的“數字”重復是你的問題。 1+12+1
匹配的原因是因為您的正則表達式將其匹配為1+1
后跟2+1
。 這也是1+1+1
不匹配的原因。
解決方案是以數字開頭,然后只重復“運算符,然后是數字”部分。
注意\d
是數字的縮寫,比 [0-9] 短。
最后,您說過任何數量的運算符都可以,這沒有任何意義。 試試看:根據您的正則表達式, 1++1
是有效的。
把它們放在一起:
\s*\d+(\s*[-+*/]\s*\d+)+
是你所需要的全部。
使用正則表達式(\s*[0-9]+\s*([+-]+\s*[0-9]+\s*)*)
。 檢查這個以獲得正則表達式的解釋。
public class Main {
public static void main(String[] args) {
String[] arr = { "1 + 1", "1 + 1 + 1", "2 + 2 - ", "2 + 2 - 3", "1 + 12 + 1" };
for (String s : arr) {
System.out.println(s + " => " + s.matches("(\\s*[0-9]+\\s*([+-]+\\s*[0-9]+\\s*)*)"));
}
}
}
Output:
1 + 1 => true
1 + 1 + 1 => true
2 + 2 - => false
2 + 2 - 3 => true
1 + 12 + 1 => true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.