簡體   English   中英

用Java標記中綴字符串

[英]Tokenizing an infix string in Java

我正在Java中實現Shunting Yard算法 ,作為我的AP計算機科學課程的一個副項目。 我在Javascript中實現了一個簡單的算法,只有基本的算術表達式(加法,減法,乘法,除法,取冪)。 要將它拆分成一個數組,我所做的就是找到每個運算符( +-*/^ ),以及數字和括號,然后在它們周圍放置一個空格,然后我將它拆分成一個數組。 例如,中綴字符串4+(3+2)將被制成4 + ( 3 + 2 ) ,然后在空白上分割。

但是,我覺得這種方法非常慢,當你開始添加正弦,余弦,正切,絕對值等數學函數時,它實現起來越來越難以實現。

將像sin(4+3)-8這樣的字符串分成數組["sin","(" 4,"+",3,")","-",8]什么?

我可以使用正則表達式,但我並不是很了解它們,我正在努力學習它們,所以如果這對他們來說是最好的解決方案,請問回答者能解釋它的作用嗎?

嘗試.split ing正則表達式

(?<=[^\.a-zA-Z\d])|(?=[^\.a-zA-Z\d])

它會在任何前面或后面跟着非字母數字字符或句點的地方拆分字符串。

  • (?<=[^\\.a-zA-Z\\d])是一個積極的外觀 如果前面的字符串與(?<=...)包含的子正則表達式匹配,它匹配兩個字符之間的位置。
    • [^\\.a-zA-Z\\d]是一個否定的字符類 它匹配[^...]未包含的單個字符
      • \\. 匹配角色.
      • az匹配az之間a任何小寫字符。
      • AZ是相同的,但對於大寫。
      • \\d相當於[0-9] ,因此它匹配任何數字。
  • | 相當於“或” 它使正則表達式與正則表達式的前一半或后一半匹配。
  • (?=[^\\.a-zA-Z\\d])與正則表達式的前半部分相同,只是它是一個正向前瞻 如果以下字符串與(?=...)包含的子正則表達式匹配,則它匹配兩個字符之間的位置。

您可以在java中實現此正則表達式,如下所示:

String str = "sin(4+3)-8";
String[] parts = str.split("(?<=[^\\.a-zA-Z\\d])|(?=[^\\.a-zA-Z\\d])");

結果:

["sin","(" 4,"+",3,")","-","8"]

暫無
暫無

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

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