Извините, если я действительно глуп (я стараюсь избегать Java-ish RegEx и в основном использую Perl для таких вещей), но я столкнулся с проблемой, которая меня действительно беспокоит.
У меня есть ресурс XQuery в конвейере OSB, который использует написанную мной функцию, ядром которой является извлечение данных tlv (ИМЯ;[число];ЗНАЧЕНИЕ;ИМЯ;[число];ЗНАЧЕНИЕ;...) как так:
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 ''
Он работает примерно в 50% случаев и, по-видимому, не работает с большими строками, учитывая массивную org.apache.xmlbeans.impl.regex.RegularExpression.matchString
рекурсивную трассировку стека.
Дело в том, что он иногда терпит неудачу на вводе $arg
, которым он ранее был доволен, поэтому я предполагаю, что ему просто не хватает памяти в зависимости от того, что еще происходит в это время, так что это указывает на неэффективное выражение, а не на выражение, которое не работает. не работает.
Дело в том, что я не вижу лучшего способа определить это, чем сопоставление .*NAME;\d+;
, особенно с учетом того, что XQuery и/или OSB кажутся довольно ограниченными (\d на самом деле не работает, поэтому [0-9] в моем коде )... если я не упустил что-то очевидное.
Есть идеи?
tokenize($input,';')
? - person Cylian   schedule 10.07.2012$name
(или один элемент после, если я сделаюtokenize($input,';[0-9]+;')
). Хотя может попробовать. - person Marc   schedule 10.07.2012