簡體   English   中英

如何在 Java 中使用正則表達式匹配有效的操作序列

[英]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.

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