【问题标题】:java.util.UnknownFormatConversionException: Conversion = '&' after upgrading jsoup version from 1.10.2 to 1.14.2 [closed]java.util.UnknownFormatConversionException:将jsoup版本从1.10.2升级到1.14.2后转换='&'[关闭]
【发布时间】:2022-01-22 10:33:41
【问题描述】:

这是输入:[style~=url(\s*?['|"]?(http://[\w_-]+(?:(?:.[\w_-]+)+) )[\w.,@?^=%&:/~$+#-]*[\w@?^=%&/~+#-])['|"]?)] 到 jsoup 选择器类。

这是完整的堆栈跟踪:

java.util.UnknownFormatConversionException: Conversion = '&'
    at java.util.Formatter.checkText(Formatter.java:2579)
    at java.util.Formatter.parse(Formatter.java:2565)
    at java.util.Formatter.format(Formatter.java:2501)
    at java.util.Formatter.format(Formatter.java:2455)
    at java.lang.String.format(String.java:2940)
    at org.jsoup.select.Selector$SelectorParseException.<init>(Selector.java:167)
    at org.jsoup.select.QueryParser.parse(QueryParser.java:47)
    at org.jsoup.select.Selector.select(Selector.java:95)
    at org.jsoup.nodes.Element.select(Element.java:421)
    

【问题讨论】:

  • 详细错误信息:详细错误信息:在 'style~=url(\s*?['|"]?(http://[\w_-]+( ?:(?:\.[\w_-]+)+)[\w.,@?^=%&:\/~$+#-]*[\w@?^=%&\/~+ #-])['|"]?)'
  • 抱歉,刚刚检查过,Java 中的非转义方括号在平衡文本时无效。在每个其他引擎中,在类中打开未转义的括号都可以。不幸的是,现在看来原因很明显了。
  • 这是我的正则表达式:(http://[\w_-]+(?:(?:.[\w_-]+)+)[\w.,@?^= %&:/~$+#-]*[\w@?^=%&/~+#-])['|"]?) 和 jsoup 详细的错误信息是 Did not find balance marker 。要改什么我的正则表达式使其平衡?
  • (http://[\w_-]+(?:(?:.[\w_-]+)+)[\w.,@?^=%&amp;:/~$+#-]*[\w@?^=%&amp;/~+#-])['|"]?) &lt;-- Unbalanced ')' 删除最后一个)
  • 对我来说,这整件事 style~=url( 散发着 Perl 运算符 ~= 的味道。给它一些分隔符,即。 style~=/url(\s*?['|"]?(http://[\w_-]+(?:(?:\.[\w_-]+)+)[\w.,@?^=%&amp;:\/~$+#-]*[\w@?^=%&amp;\/~+#-])['|"]?)/ 除非 url() 是一个函数。如果是这样,则返回以() 作为分隔符的方格 1。必须转义内部 () 的地方。

标签: java regex jsoup regexp-replace


【解决方案1】:

您或其他代码通过String.format(或可能System.out.printf,内部调用String.format)将正则表达式作为原始正则表达式值抛出。通过 String.format 抛出任意字符串不起作用。 JSoup 有一个错误,或者您的代码有。这是一个理论:

  • 由于升级,现在发生了一些 1.10 没有的未知错误。
  • JSoup 正在尝试生成一个很好的错误消息,以便您将异常推入,这将解释这个“未知错误”可能是什么。
  • 作为生成此消息的一部分,JSoup 有一个错误,它试图将正则表达式直接推入 String.format 的“格式模式”字符串而不是作为参数。这确实是一个错误,但很少被触发; JSoup 中存在这个错误是合理的;两个版本。
  • 仅当您使用 jsoup14 时才会出现此生成错误消息(它本身会引发您得到的异常)的代码路径,但它存在于所有 jsoup 版本中。
  • 你得到的真正错误现在被隐藏了;你根本不知道它是什么,因为这个错误是产生真正错误的一部分。

解决办法?好吧,用 jsoup 把它作为一个 bug 归档,去调查代码路径; jsoup 是开源的。

以上相关证明是正确的分析:

【讨论】:

  • 我在 JSoup 项目中就这个问题发了一个bug report
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 2018-04-12
相关资源
最近更新 更多