Регулярное выражение XQuery StackOverflowError в OSB

Извините, если я действительно глуп (я стараюсь избегать 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] в моем коде )... если я не упустил что-то очевидное.

Есть идеи?


person Marc    schedule 10.07.2012    source источник
comment
Вы пробовали tokenize($input,';')?   -  person Cylian    schedule 10.07.2012
comment
Я предполагаю, что это все равно будет запускать несколько совпадений в одной и той же строке, поэтому также могут возникнуть проблемы. Это также означает, что мне нужно пройти токенизированный вывод, чтобы получить элемент через два места после совпадающего $name (или один элемент после, если я сделаю tokenize($input,';[0-9]+;')). Хотя может попробовать.   -  person Marc    schedule 10.07.2012


Ответы (1)


Вам действительно нужно .* там? Разве это не соответствует множеству вещей? Как насчет [.&&[^;]]* или эквивалента? т. е. соответствует чему угодно .* соответствует, кроме точки с запятой.

person Will    schedule 10.07.2012
comment
К сожалению, как я уже говорил, RegEx XQuery (и/или его реализация в OSB) кажется слабым; совпадение без ведущего .* было тем, что я попробовал первым, и ничего не соответствует... - person Marc; 10.07.2012