Якоря регулярных выражений внутри символьного класса
Можно ли использовать якоря внутри символьного класса? Это не работает:
analyze-string('abcd', '[s^]abcd[s$]')
Выглядит так, что ^
и $
рассматриваются как литералы внутри символьного класса; однако, экранируя их (^
, $
) тоже не работает.
Я пытаюсь использовать это выражение для создания границ слов (b
недоступно в XSLT/XQuery), но я бы предпочел не использовать группы ((^|s)
) - поскольку группы без захвата недоступны, это означает, что в некоторых сценариях я могу закончить с большое количество ненужных групп захвата, и это создает новую задачу поиска "реальных" групп захвата в наборе ненужных.
3 ответа:
Я считаю, что ответ Нет, вы не можете включать
Тем не менее, вы можете объединить пространство на передней и задней части строки, а затем просто искать^
и$
в качестве якорей в[]
, только в качестве буквенных символов. (Мне тоже хотелось бы, чтобы вы могли сделать это раньше.)\s
Как границы слов и не обращать внимания на якоря. Например,analyze-string(concat(' ', 'abcd xyz abcd', ' '), '\sabcd\s')
Вы также можете хотеть
+
после каждого\s
, но это отдельная проблема.
Если вы используете
analyze-string
в качестве функции, то, вероятно, вы используете реализацию 3.0 либо XSLT, либо XQuery.В таком случае, почему вы говорите, что "группы без захвата недоступны"? В XPath-функциях и операторах 3.0 spec явно указывается, что "группы без захвата также распознаются. Они обозначаются синтаксисом (?: xxxx)."
Использование знака после первой квадратной скобки приведет к отрицанию класса символов. Это, по сути, дает вам противоположность тому, что вы ищете, то есть класс символов будет соответствовать любому символу, который не входит в класс символов. Отрицаемые классы символов также соответствуют (невидимым) символам разрыва строки.
Вы могли бы попробовать сделать негативный взгляд вперед, возможно.
(?!\s)