我知道有关于正则表达式和长字符串的堆栈溢出错误的一些帖子,但它们没有帮助我,也从不关心我的解析问题类型。
我只是试图从数学函数中找到括号中的字符串,例如
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)
我不知道是否可以某种方式改进模式以防止迭代,这似乎导致堆栈溢出。显然,拆分功能在这里不起作用。
另外 - 因为字符串很长 - 我想允许n \ 作为角色。由于科学原因,我想通常使用大十进制数(使用apfloat)来获得至少大约100到1000个精确小数,是否可以保持正则表达式改变模式?
如果没有,我该如何重写正则表达式?
有更好的工具吗?
答案 0 :(得分:2)
SIN\((\d+\.?\d*)\)
我编辑了允许带小数的数字。而不是随机.
和数字。
(?:SIN|COS|TAN)\(([-]?\d+\.?\d*\^?\d*)\)
这允许使用函数sin,cos或tan来添加更多函数,只需在开始时添加|{functionname}
。此外,它可以是带指数的负值。
或者你可以
.+\(([-]?\d+\.?\d*\^?\d*)\)
这将允许任何内容位于()
我不太明白你想要的* - /
我建议你为每个函数单独设置REGEX,这样你就可以区别对待它们。