【问题标题】:XQuery regex StackOverflowError in OSBOSB 中的 XQuery 正则表达式 StackOverflowError
【发布时间】:2012-07-10 12:57:01
【问题描述】:

对不起,如果我真的很愚蠢(我尽量避免使用 Java-ish RegEx,并且主要使用 Perl 来处理这类事情),但我遇到了一个真正困扰我的问题。

我在 OSB 管道中有一个 XQuery 资源,该资源使用我编写的函数,其核心是提取 t-l-v 数据 (NAME;[number];VALUE;NAME;[number];VALUE;.. .) 这样:

if ($arg != '' and $name != '' and matches($arg, concat('.*;', $name, ';[0-9]+;')))
  then substring(normalize-space(substring-before(replace($arg, concat('.*;', $name, ';[0-9]+;'), ''), ';')), 1, 64)
  else ''

考虑到大量的org.apache.xmlbeans.impl.regex.RegularExpression.matchString 递归堆栈跟踪,它大约有 50% 的时间工作,并且可能在更大的字符串上失败。

问题是,它有时会在它之前很满意的 $arg 输入上失败,所以我猜它只是内存不足,这取决于当时发生的其他事情,所以这指向一个低效的表达式反对一种不起作用的方法。

问题是,我找不到比匹配 .*NAME;\d+; 更好的方法来定义它 - 特别是考虑到 XQuery 和/或 OSB 似乎相当有限(\d 实际上没有工作,因此 [0- 9] 在我的代码中)...除非我遗漏了一些明显的东西。

有什么想法吗?

【问题讨论】:

  • 你试过tokenize($input,';')吗?
  • 我猜这仍然会在同一个字符串上运行多个匹配项,因此也可能会遇到问题。这也意味着我必须遍历标记化的输出以在匹配的$name 之后的两个位置获取项目(或者如果我执行tokenize($input,';[0-9]+;'),则在之后的一个项目)。不过可以试一试。

标签: java regex xquery osb


【解决方案1】:

你真的需要 .* 吗?这不匹配很多的东西吗? [.&&[^;]]* 或等价物怎么样?即匹配任何东西 .* 匹配除了分号。

【讨论】:

  • 不幸的是,就像我之前所说的,XQuery 的 RegEx(和/或 OSB 的实现)似乎很弱;没有前导 .* 的匹配是我首先尝试的,并且没有匹配...
猜你喜欢
  • 2023-03-18
  • 2012-06-20
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多