XQuery: подстрока до/после появления определенного символа много раз?

У меня есть эта строка ($str): 67-89-90T, и я хочу сохранить 67-89.

Конечно, substring-before($str,'-') возвращает 67, но как мне выбрать 2-й тире?


person Rob    schedule 24.12.2012    source источник
comment
Вас может заинтересовать альтернативное решение, которое не использует RegExes.   -  person Dimitre Novatchev    schedule 25.12.2012
comment
@DimitreNovatchev: Хотя технически токенизация также использует регулярное выражение   -  person BeniBela    schedule 25.12.2012
comment
@BeniBela, да, но для большинства случаев использования tokenize(), как в этом случае, второй переданный аргумент - это просто строка.   -  person Dimitre Novatchev    schedule 25.12.2012


Ответы (3)


Решение XPath 2 будет:

replace("67-89-90T", "(.*)-[^-]*$", "$1")

(тоже работает, если нет -, так как тогда не совпадает и ничего не заменяет)

person BeniBela    schedule 24.12.2012

Решение XPath 2.0 с использованием токенизации может быть более читабельным и понятным, чем использование RegEx:

string-join(tokenize(concat($vStr,'-'), '-')
                                     [.][not(position() eq last())], 
            '-')

При запуске с процессором XQuery или с процессором XPath 2.0 выражение:

string-join(tokenize(concat('-', '67-89-90T','-'), '-')
                                     [.][not(position() eq last())], 
            '-')

выдает желаемый правильный результат:

67-89
person Dimitre Novatchev    schedule 24.12.2012
comment
Вы действительно называете это более читабельным? Но я разочарован, я ожидал, что вы опубликуете решение XPath 1... - person BeniBela; 25.12.2012
comment
@BeniBela, это более читабельно, чем RegEx, потому что в этом случае читатель не должен знать совершенно новый язык - RegEx. При правильном форматировании он становится еще более читабельным. - person Dimitre Novatchev; 25.12.2012

Хорошо, я наконец нашел functx:substring-before-last. Не выбирает конкретную черту, но в этом случае работает для меня.

http://www.xqueryfunctions.com/xq/functx_substring-before-last.html

person Rob    schedule 24.12.2012