【发布时间】: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]+;'),则在之后的一个项目)。不过可以试一试。