【问题标题】:Splitting long error message拆分长错误消息
【发布时间】:2014-03-19 13:17:31
【问题描述】:

我目前正在尝试向我的应用程序添加一些错误消息。为此,我使用JOptionPane.showMessageDialog(...);
基本上一切都按我的预期工作。但有一件事是有点痛苦。 我正在使用e.getMessage() 来接收所发生错误的描述。

在 sql 连接错误的情况下,这是一条很长的消息,它不可能适合屏幕。所以我想在每个句子之后使用split([\\.]) 拆分它。

这也行得通,但是:消息中包含这样的部分
Error: "java.net.SocketTimeoutException: Receive timed out".,当然最后是:

Error: "java
net
SocketTimeoutException: Receive timed out"

如何避免这种行为?或者有没有更好的方法来实现拆分错误消息的结果?

【问题讨论】:

    标签: java regex split


    【解决方案1】:

    为什么不在前面有点的每个空格上拆分?

    试试split("(?<=[.])\\s+")

    (?<=[.])positive-look-behind。它用于确保空格组\\s+前面有一个点,但不会在匹配中包含这个点,因此它在拆分后将保持不变,而空格将被删除。

    【讨论】:

    • 很好,有更好的逻辑来解决这个问题。谢谢!
    【解决方案2】:

    在完整发布您的输入和预期结果之前不确定,但您可以为此目的使用“环视”。

    例如:

    String input = "Error: \"java.net.SocketTimeoutException: Receive timed out\".";
    System.out.println(Arrays.toString(input.split("(?<!\\w)\\.(?!\\w)")));
    

    输出

    [Error: "java.net.SocketTimeoutException: Receive timed out"]
    

    说明

    • 它基于(转义)点Patterns 拆分String,其前后均不包含任何单词字符
    • 它打印拆分 Array(这里只有 1 个元素,因为包分隔点与预期的 Pattern 不匹配)

    【讨论】:

    • 就是这样,谢谢!基本上向后看就足够了,因为额外的向前看将避免在“正常”句子的末尾出现分裂。
    • @JochenReinschlüssel 很高兴它有帮助:)
    【解决方案3】:

    使用正则表达式的另一种方法是使用apache.commons.lang 包中的WordUtils.wrap。使用正则表达式的优点是不使用额外的库,但会使代码更难读。在您的情况下,这并不是什么大问题,但作为一个额外的好处,commons.lang 包含大量有用的东西,它们可能会在您的项目中派上用场。

    它是我工具带中几乎不变的库之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2015-08-30
      • 2017-11-23
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多