Якоря регулярных выражений внутри символьного класса


Можно ли использовать якоря внутри символьного класса? Это не работает:

analyze-string('abcd', '[s^]abcd[s$]') 

Выглядит так, что ^ и $ рассматриваются как литералы внутри символьного класса; однако, экранируя их (^, $) тоже не работает.

Я пытаюсь использовать это выражение для создания границ слов (b недоступно в XSLT/XQuery), но я бы предпочел не использовать группы ((^|s)) - поскольку группы без захвата недоступны, это означает, что в некоторых сценариях я могу закончить с большое количество ненужных групп захвата, и это создает новую задачу поиска "реальных" групп захвата в наборе ненужных.

3 6

3 ответа:

Я считаю, что ответ Нет, вы не можете включать ^ и $ в качестве якорей в [], только в качестве буквенных символов. (Мне тоже хотелось бы, чтобы вы могли сделать это раньше.)

Тем не менее, вы можете объединить пространство на передней и задней части строки, а затем просто искать \s Как границы слов и не обращать внимания на якоря. Например,
analyze-string(concat(' ', 'abcd xyz abcd', ' '), '\sabcd\s')

Вы также можете хотеть + после каждого \s, но это отдельная проблема.

Если вы используете analyze-string в качестве функции, то, вероятно, вы используете реализацию 3.0 либо XSLT, либо XQuery.

В таком случае, почему вы говорите, что "группы без захвата недоступны"? В XPath-функциях и операторах 3.0 spec явно указывается, что "группы без захвата также распознаются. Они обозначаются синтаксисом (?: xxxx)."

Использование знака после первой квадратной скобки приведет к отрицанию класса символов. Это, по сути, дает вам противоположность тому, что вы ищете, то есть класс символов будет соответствовать любому символу, который не входит в класс символов. Отрицаемые классы символов также соответствуют (невидимым) символам разрыва строки.

Вы могли бы попробовать сделать негативный взгляд вперед, возможно.

(?!\s)