2017-03-13 3 views
0

この質問は何度も尋ねられていますが、私はフォーラムでRegExに関するほぼすべての記事を読んだことがあります。しかし、ついにこのことが、ゆっくりとしかし確実に私を殺している! :D 何か助けていただければ幸いです。複数行RegExの2つの文字列間の読み取り

データベースに接続しようとしたときにdbエンジンが実行されていないと、予期したとおりにconnection refused例外が発生します。しかし、未知の理由から、この例外は複数回ネストされています(私はどれくらい多くの... 20,30,40 ... !!!)回とmyException.getCause()の呼び出しは毎回NULLを返します。

そのため、ユーザーにstacktrace全体を表示したくないので、正規表現でメインメッセージだけをキャッチするのはすばらしく簡単です。残念ながら、私はそれが期待されるほど簡単ではありません。

まず、スタックトレースの不要な部分を切り捨ててメッセージを削除するのは良い解決策だと思いますか?もしそうでなければ、何をお勧めしますか?

私の例外は、以下のようになります。

Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.ConnectException 
MESSAGE: Connection refused: connect 

STACKTRACE: 

java.net.ConnectException: Connection refused: connect 
     at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
     at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) 
     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
     at java.net.Socket.connect(Socket.java:589) 
     at java.net.Socket.connect(Socket.java:538) 
     at java.net.Socket.(Socket.java:434) 
     at java.net.Socket.(Socket.java:244) 
     at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256) 
     at com.mysql.jdbc.MysqlIO.(MysqlIO.java:271) 
     at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771) 
     at com.mysql.jdbc.Connection.(Connection.java:1555) 
     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) 
     at java.sql.DriverManager.getConnection(DriverManager.java:664) 
     at java.sql.DriverManager.getConnection(DriverManager.java:247) 

............. and so on ............ 

私は例えばEXCEPTION **STACKTRACE間の文字列を取得するために、さまざまなパターンを試してみました:

EXCEPTION(\r?\n?.*?\r?\n?)*STACKTRACE 

または

EXCEPTION\s*\W*(.*|\r*|\n*)+STACKTRACE 

何も動作するようです。 (?s)EXCEPTION \*\*\s*(.*?)\s*STACKTRACE:事前

+0

正規表現の良い習慣だけど、それは良い考えだとは思わない。意味のあるメッセージが必要な場合は、マルチキャッチブロックを使用してユーザーにいくつかの一般的な情報を表示することができ、「ArrayIndexOutOfBoundsException -1」を理解できるユーザー。つまり、データなどを解析できませんでした。 – HRgiger

+0

@ Core-Update 'myException.getMessage()'と 'myException.getLocalizedMessage()'はどうですか?どちらもNULLを返しますか? – Pons

+0

@Pons 'myException.getMessage()'を使用すると、このメッセージ(スタックトレース全体)が表示されます。 localizedMessageは、通常のgetMessageと同じものを出力します。 –

答えて

2

おかげでこれを試してみてください。

Javaでは、これは"(?s)EXCEPTION \\*\\*\\s*(.*?)\\s*STACKTRACE"となります。

または2つではなく、より良いパフォーマンスのため\s*、結果はtrim()です。

デモ用のregex101を参照してください。

+0

これは問題ありません。私は '(?s)'なしでまったく同じパターンを試してみましたが、うまくいかなかったのですが、これは何の意味ですか? –

+1

@ Core-Update javadoc ['Pattern.DOTALL'](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#DOTALL)、または「モードの​​指定正規表現の内部](http://www.regular-expressions.info/modifiers.html)の 'regular-expressions.info'にあります。 – Andreas

+0

大丈夫です。大変ありがとう@アンドレアス –

関連する問題