正则表达式字符串拆分优先考虑一个字符而不是另一个

苏哈斯

我知道有很多正则表达式帖子,但我无法准确找到我需要的内容。我正在创建一个计算器应用程序,为此我有一个方程,我需要根据方程中存在的运算符进行标记。

例子:

"123x849-302+450" -> ["123", "849", "302", "450"]

"124x(145+301)x402+(-402)" -> ["124", "145+301", "402", "-402"]

"124x((234+403)/354))+(-21)" -> ["124", "(234+403)/354", "-21"]

基本上,如果有括号,我需要获取括号内的令牌,否则就根据运算符拆分。

我对正则表达式很不擅长,只知道非常基础的知识。我不知道如何在正则表达式中包含括号,现在,我所拥有的就是:

String delim = "[x+/-]";
String[] tokens = equation.toString().split(delim);

toString 存在是因为 equation 是 StringBuilder。

rzwitserloot

“常规”语法的概念是一个学术概念。“正则表达式”命名正确:它们可以解析任何“正则”语法,但不能用于解析非正则语法。

让我们将“基础数学”定义为数字、4 个运算符:+-*/和括号的组合。

“基础数学”不是常规的

因此它不能用正则表达式解析。

你想要的是一个解析器,可以把这个:

a+x*y+(b-c)*e

进入这个数据结构:

          PLUS
      /           \
    PLUS          TIMES
  /     \         /     \
a      TIMES    MINUS   e
      /   \    /  \
      x   y    b   c

可以使用各种解析器技术,例如递归下降或 Packrat(例如使用 grappa/parboiled 解析器库),以及各种基于 LALR 和 LL(k) 的解析器技术,例如 ANTLR。通常这些是非常复杂的技术;也许对于这种微不足道的事情,您可以为此编写自己的基于递归下降的解析。

但是,回到你原来的问题,如果你想a+x*y+(b-(g+h))*e分成:['a', 'x', 'y', '(b-(g+h))', 'e'],这只是您需要的一部分,因为现在您仍然需要弄清楚如何处理 '(b-(g+h))' 节点,正则表达式根本无法做到这一点:您希望正则表达式(b作为括号块的开始,然后....你的正则表达式必须计算开括号的数量,然后找到尽可能多的闭括号并忽略它们,然后在那些之后的闭括号获胜。所以,这个正则表达式:

String elementPattern = "(\\([^\\)]+\\)|[^-+*/\\(\\)]+)";
Pattern p = Pattern.compile("^\\s*" + elementPattern + "(\\s*[-+*/]\\s*" + elementPattern + ")*$");

乍一看似乎可以完成这项工作,但实际上并不能完成这项工作:它会停止考虑2 个关闭括号(b-(g+h))中的第一个部分,因此无法匹配。它需要在第二个停止,但正则表达式没有任何方法可以做到这一点,因为那不是“常规”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式从一个字符串到另一个字符串

来自分类Dev

正则表达式以匹配2个字符串并包含另一个字符串

来自分类Dev

正则表达式以匹配多个字符串之一,然后是另一个字符串

来自分类Dev

使用NSPredicate或正则表达式检查一个大字符串是否包含另一个字符串

来自分类Dev

如何使用正则表达式从另一个字符串的开头删除多个字符串

来自分类Dev

如何使用正则表达式按最后一个字符拆分字符串?

来自分类Dev

两个可能包含另一个字符串的字符串之间的正则表达式匹配

来自分类Dev

一个正则表达式,用于搜索包含一个字符串但不包含另一个字符串的行

来自分类Dev

查找一些字符串并使用notepad ++正则表达式替换另一个字符串

来自分类Dev

正则表达式-查找行中的字符串,但替换同一行中的另一个字符串

来自分类Dev

检查一个字符串是否包含另一个字符串的全部或3个连续字符?正则表达式python不区分大小写

来自分类Dev

正则表达式多个元素一个字符串

来自分类Dev

正则表达式以查找多行字符串,其中包括行之间的另一个字符串

来自分类Dev

正则表达式以查找多行字符串,其中包括行之间的另一个字符串

来自分类Dev

正则表达式捕获字符串,直到遇到另一个字符串

来自分类Dev

正则表达式匹配另一个字符串之后出现的字符串

来自分类Dev

在另一个字符串中查找 JSON 字符串的正则表达式

来自分类Dev

使用正则表达式和 C# 识别另一个字符串中不存在的字符串

来自分类Dev

PHP 中的正则表达式:从另一个字符串中检索特定字符串

来自分类Dev

正则表达式匹配行与字符串 AND 没有另一个字符串

来自分类Dev

正则表达式:仅在字符串中找到另一个字符时才允许使用该字符

来自分类Dev

正则表达式:仅在字符串中找到另一个字符时才允许使用该字符

来自分类Dev

正则表达式是一个字符还是另一个?

来自分类Dev

正则表达式排除一个或另一个字符

来自分类Dev

仅当行不包含另一个字符串时,正则表达式才匹配一个字符串

来自分类Dev

如何停止在正则表达式中另一个字符串之前是否出现一个字符串

来自分类Dev

创建正则表达式以仅在包含一个字符串而排除另一个字符串的情况下查找整个单词

来自分类Dev

正则表达式如何仅在存在另一个字符时才捕获最多一个字符的字符串

来自分类Dev

摩擦正则表达式:匹配一个字符,除非在另一个字符之后

Related 相关文章

  1. 1

    正则表达式从一个字符串到另一个字符串

  2. 2

    正则表达式以匹配2个字符串并包含另一个字符串

  3. 3

    正则表达式以匹配多个字符串之一,然后是另一个字符串

  4. 4

    使用NSPredicate或正则表达式检查一个大字符串是否包含另一个字符串

  5. 5

    如何使用正则表达式从另一个字符串的开头删除多个字符串

  6. 6

    如何使用正则表达式按最后一个字符拆分字符串?

  7. 7

    两个可能包含另一个字符串的字符串之间的正则表达式匹配

  8. 8

    一个正则表达式,用于搜索包含一个字符串但不包含另一个字符串的行

  9. 9

    查找一些字符串并使用notepad ++正则表达式替换另一个字符串

  10. 10

    正则表达式-查找行中的字符串,但替换同一行中的另一个字符串

  11. 11

    检查一个字符串是否包含另一个字符串的全部或3个连续字符?正则表达式python不区分大小写

  12. 12

    正则表达式多个元素一个字符串

  13. 13

    正则表达式以查找多行字符串,其中包括行之间的另一个字符串

  14. 14

    正则表达式以查找多行字符串,其中包括行之间的另一个字符串

  15. 15

    正则表达式捕获字符串,直到遇到另一个字符串

  16. 16

    正则表达式匹配另一个字符串之后出现的字符串

  17. 17

    在另一个字符串中查找 JSON 字符串的正则表达式

  18. 18

    使用正则表达式和 C# 识别另一个字符串中不存在的字符串

  19. 19

    PHP 中的正则表达式:从另一个字符串中检索特定字符串

  20. 20

    正则表达式匹配行与字符串 AND 没有另一个字符串

  21. 21

    正则表达式:仅在字符串中找到另一个字符时才允许使用该字符

  22. 22

    正则表达式:仅在字符串中找到另一个字符时才允许使用该字符

  23. 23

    正则表达式是一个字符还是另一个?

  24. 24

    正则表达式排除一个或另一个字符

  25. 25

    仅当行不包含另一个字符串时,正则表达式才匹配一个字符串

  26. 26

    如何停止在正则表达式中另一个字符串之前是否出现一个字符串

  27. 27

    创建正则表达式以仅在包含一个字符串而排除另一个字符串的情况下查找整个单词

  28. 28

    正则表达式如何仅在存在另一个字符时才捕获最多一个字符的字符串

  29. 29

    摩擦正则表达式:匹配一个字符,除非在另一个字符之后

热门标签

归档