Это выражение XPath 2.0:
for $vS in 'Twentyone one two three'
return
codepoints-to-string(
reverse(
string-to-codepoints(
substring-before(
codepoints-to-string(
reverse(string-to-codepoints($vS))
),
'eno')
)
)
)
при оценке производит строку:
«two three
»
Объяснение:
Проблема заключается в том, чтобы найти подстроку после последнего появления строки «один» в исходной строке.
Одним из решений является найти подстроку перед строкой «eno» (обратная сторона «один») в исходной исходной строке - затем отмените результат.
В XPath 2.0 есть стандартная функция reverse()
, которая производит из последовательности другую, которая является обратной исходной последовательностью. Существует также стандартная функция XPath 2.0 string-to-codepoints()
, которая из строки создает последовательность кодовых точек (думаю, Unicode «коды символов»), которые содержат эту строку. И наоборот, стандартная функция XPath 2.0 codepoints-to-string()
принимает последовательность действительных кодовых точек Unicode (целые числа) и создает строку, состоящую из этих кодовых точек.
Таким образом, выражение XPath 2.0, который производит обратную строку $vS
является:
codepoints-to-string(reverse(string-to-codepoints($vS)))
Используя эти знания, мы можем построить выражение в XPath 2.0 выше, которое обеспечивает желаемое решение.
Даже в более общем:
Чтобы найти подстроку $vS
после последнего появления $vS2
в нем, используйте это выражение XPath 2.0:
codepoints-to-string(
reverse(
string-to-codepoints(
substring-before(
codepoints-to-string(
reverse(string-to-codepoints($vS))
),
codepoints-to-string(reverse(string-to-codepoints($vS2))))
)
)
)
II.Альтернативное решение - если нужны только слова после последнего вхождения строки
Если вам нужна только последовательность возвращающих слов после последнего вхождения конкретной строки («одна») - без точных разделителей, вы можете использовать этот XPath 2.0 выражение:
for $vS in 'Twentyone one two three'
return
tokenize($vS, '\W')[position() > index-of(tokenize($vS, '\W'), 'one')[last()]]
В случае, если нет необходимости последовательность завершающих слов, но их конкатенации (с использованием стандартного разделителя, например, пространство), использование:
for $vS in 'Twentyone one two three'
return
string-join(
tokenize($vS, '\W')[position() > index-of(tokenize($vS, '\W'), 'one')[last()]],
' ')