简体   繁体   English

多行正则表达式在两个字符串之间读取

[英]Multiline RegEx read between two strings

I know this question has been asked many times and I assure you that I have read almost all posts about RegEx on the forum and tried for hours to get a solution. 我知道这个问题已经被问过很多次了,我向您保证,我已经阅读了论坛上有关RegEx的几乎所有帖子,并尝试了数小时才能获得解决方案。 But finally this thing is killing me, slowly but surely! 但是最终,这件事正在慢慢地,但肯定是在杀死我! :D Any help is appreciated. :D任何帮助表示赞赏。

When I try to connect to a database and there is no db engine running, I get a connection refused Exception as expected. 当我尝试连接到数据库并且没有数据库引擎在运行时,出现connection refused异常。 But for unknown reasons this exception is nested multiple (I don't know how many... 20, 30, 40...!!!) times and a call for myException.getCause() returns everytime NULL. 但是由于未知原因,此异常嵌套了多次(我不知道有多少... 20、30、40 ... !!!)次,并且每次NULL时都返回对myException.getCause()的调用。

For that reason and because I don't want to show the whole stacktrace to users I thougt it would be nice and easy to catch just the main message with regular expressions. 出于这个原因,并且因为我不想向用户显示整个堆栈跟踪信息,所以我想用正则表达式捕获主要消息会很容易。 Unfortunately it is not as easy as I expected it to be. 不幸的是,这并不像我预期的那么容易。

First of all, do you think it is a good solution to strip down the message by cutting off the unwanted parts of a stacktrace? 首先,您认为通过切断堆栈跟踪中不需要的部分来精简消息是一个很好的解决方案吗? And if not, what do you suggest? 如果没有,您有何建议?

My Exception looks like that: 我的异常看起来像这样:

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 ............

I tried many different patterns to get the String between EXCEPTION ** and STACKTRACE for example: 我尝试了许多不同的模式来获取EXCEPTION **STACKTRACE之间的字符串,例如:

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

or 要么

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

but nothing seems to work. 但似乎没有任何效果。

Thanks in advance 提前致谢

Try this: (?s)EXCEPTION \\*\\*\\s*(.*?)\\s*STACKTRACE . 试试这个:( (?s)EXCEPTION \\*\\*\\s*(.*?)\\s*STACKTRACE

In Java, that would be "(?s)EXCEPTION \\\\*\\\\*\\\\s*(.*?)\\\\s*STACKTRACE" . 在Java中,这将是"(?s)EXCEPTION \\\\*\\\\*\\\\s*(.*?)\\\\s*STACKTRACE"

Or maybe without the two \\s* , for better performance, and trim() the result. 或者可能没有两个\\s* ,以获得更好的性能,并trim()结果。

See regex101 for demo. 演示请参见regex101

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM