【问题标题】:stack overflow error with regex for parsing用于解析的正则表达式的堆栈溢出错误
【发布时间】:2013-09-11 19:48:20
【问题描述】:

我知道已经有一些关于正则表达式和长字符串的堆栈溢出错误的帖子,但它们没有帮助我,也从不关心我的解析问题类型。

我只是尝试从数学函数中找到括号中的字符串,例如

 funktionsstring  
  =SIN(3.141592653589793238462643383279502884197169399375105820974944592307816406
   286208998628034825342117067982148086513282306647093844609550582231725359408
   12848111745028410270193852110555964462294895493038196);

使用以下带有模式的代码来查找括号中的字符串 x,例如。 (x):

Pattern pattern = Pattern.compile("\\([^(]*?\\)");
Matcher matcher = pattern.matcher(funktionsstring);

我收到以下错误

    Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.util.regex.Pattern.bitsOrSingle(Pattern.java:2553)
at java.util.regex.Pattern.range(Pattern.java:2601)
at java.util.regex.Pattern.clazz(Pattern.java:2507)
at java.util.regex.Pattern.sequence(Pattern.java:2030)
at java.util.regex.Pattern.expr(Pattern.java:1964)
at java.util.regex.Pattern.compile(Pattern.java:1665)
at java.util.regex.Pattern.<init>(Pattern.java:1337)
at java.util.regex.Pattern.compile(Pattern.java:1022)
at classes.Parser.Klammerauswertung(Parser.java:104)
at classes.Parser.Klammerauswertung(Parser.java:119)
at classes.Parser.Klammerauswertung(Parser.java:119)

我不知道是否可以以某种方式改进模式以防止似乎导致堆栈溢出的迭代。显然 split 函数在这里不起作用。

另外 - 因为字符串很长 - 我想允许 n\ 作为性格。出于科学原因,我想通常使用大十进制数(使用 apfloat)来获得至少 100 到 1000 个精确的小数,是否可以保持正则表达式改变模式?

如果没有,我该如何重写正则表达式?

有没有更好的工具?

【问题讨论】:

  • 我猜你的意思是[^)]*,而不是[^(]*,还有?也没什么意义。

标签: java regex stack-overflow


【解决方案1】:
 SIN\((\d+\.?\d*)\)

Edit live on Debuggex

我进行了编辑以允许带小数的数字。而不是随机的. 和数字。

(?:SIN|COS|TAN)\(([-]?\d+\.?\d*\^?\d*)\)

Edit live on Debuggex

这允许函数 sin、cos 或 tan 用于添加更多函数,只需在开头添加 |{functionname}。此外,它可以是带有指数的负值。

或者你可以拥有

.+\(([-]?\d+\.?\d*\^?\d*)\)

Edit live on Debuggex

这将允许任何东西在()前面

我不太明白你想要* - /什么我建议你为每个函数制作单独的正则表达式,这样你就可以不同地处理它们。

【讨论】:

  • 您好,我修改了在互联网上发现的适用于小数字的模式。给定的表达式只是一个例子:任何数学公式都需要是可能的,并且可能包含 +-*/ 也可能包含 ^ 代表指数、十进制数字和函数的任何字母(exp、sin、cos)。这还有可能吗?
猜你喜欢
  • 2016-10-07
  • 2013-08-09
  • 2013-07-05
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
相关资源
最近更新 更多