1

正規表現と長い文字列を使用したスタック オーバーフロー エラーに関する投稿がすでにいくつかあることは知っていますが、それらは役に立たず、私のタイプの解析の問題にはまったく関係ありませんでした。

数学関数から括弧内の文字列を見つけようとするだけです。

 funktionsstring  
  =SIN(3.141592653589793238462643383279502884197169399375105820974944592307816406
   286208998628034825342117067982148086513282306647093844609550582231725359408
   12848111745028410270193852110555964462294895493038196);

次のコードをパターンで使用して、括弧内にある文字列 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\ を許可したいと思います。科学的な理由から、少なくとも 100 から 1000 の正確な 10 進数を取得するために、(apfloat を使用して) 大きな 10 進数で一般的に作業したいのですが、正規表現でパターンを変更し続けることは可能ですか?

そうでない場合、どのように正規表現を書き直す必要がありますか?

より良いツールはありますか?

4

1 に答える 1

2
 SIN\((\d+\.?\d*)\)

正規表現の視覚化

Debuggex でライブ編集

小数を含む数値を許可するように編集しました。乱数.と数字の代わりに。

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

正規表現の視覚化

Debuggex でライブ編集

これにより、関数 sin、cos、または tan を使用して、先頭に a を追加するだけでさらに関数を追加できます|{functionname}。また、指数付きの負の値にすることもできます。

またはあなたが持つことができます

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

正規表現の視覚化

Debuggex でライブ編集

これにより、何でも前に置くことができます()

私が提案したことであなたが何を望んでいるのかよくわかりません* - /。関数ごとに個別のREGEXを作成して、それらを異なる方法で処理できるようにすることです。

于 2013-09-11T19:53:24.807 に答える