2017-03-13 5 views
0

이 질문은 여러 번 물어 보았습니다. 나는 포럼에서 RegEx에 관한 거의 모든 게시물을 읽고 솔루션을 얻으려고 몇 시간 동안 노력했음을 확신합니다. 하지만 결국이 일이 천천히 그러나 확실히 나를 죽이고 있습니다! : D 도움을 주시면 감사하겠습니다.다중 행 RegEx 두 문자열 사이의 읽기

데이터베이스에 연결하려고 시도했지만 실행중인 db 엔진이 없으면 예상대로 connection refused 예외가 발생합니다. 하지만 알 수없는 이유로이 예외는 여러 번 중첩되어 있습니다 (나는 20 ..., 30, 40 ... ...) 횟수가 얼마나되는지 모르고 myException.getCause()에 대한 호출은 매번 NULL을 반환합니다.

그 이유 때문에 전체 스택 추적을 사용자에게 표시하고 싶지 않기 때문에 정규식을 사용하여 기본 메시지를 잡는 것이 쉽고 쉽습니다. 불행히도 내가 기대했던 것만 큼 쉽지는 않습니다.

우선 스택 스택의 원치 않는 부분을 잘라내어 메시지를 제거하는 것이 좋은 해결책이라고 생각하십니까? 그리고 그렇지 않다면, 당신은 무엇을 제안합니까?

내 예외는 다음과 같습니다

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

또는

EXCEPTION\s*\W*(.*|\r*|\n*)+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 사이의 문자열을 얻기 위해 여러 가지 패턴을 시도 작동하는 것 같습니다. 사전

+0

정규식에 대한 우수 사례지만 좋은 생각이라고 생각하지 않습니다. 'ArrayIndexOutOfBoundsException -1'을 이해할 수있는 사용자는 의미있는 메시지를 원한다면 멀티 캐치 블록을 사용하고 사용자에게 일반 정보를 보여줄 수 있습니다. 즉, 데이터 등을 파싱 할 수 없습니다. – HRgiger

+0

@ Core-Update'myException.getMessage()'와'myException.getLocalizedMessage()'는 어떻습니까? 둘 다 NULL을 반환합니까? – Pons

+0

@Pons'myException.getMessage()'를 사용할 때이 메시지 (전체 스택 추적)를 얻습니다. localizedMessage는 보통의 getMessage와 같은 것을 인쇄합니다. –

답변

2

에서

덕분에이 시도 : (?s)EXCEPTION \*\*\s*(.*?)\s*STACKTRACE.

Java의 경우 "(?s)EXCEPTION \\*\\*\\s*(.*?)\\s*STACKTRACE"이됩니다.

더 나은 성능을 위해 \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) 또는 [모드 지정 Inside the Regular Expression] (http://www.regular-expressions.info/modifiers.html)을'regular-expressions.info'에 추가했습니다. – Andreas

+0

오케이, 알겠습니다. 대단히 감사합니다 @ Andreas –