Как найти слово в тексте, используя XSLT 2.0 и Regex (который не имеет b слово границы)?
-
25-09-2019 - |
Вопрос
Я пытаюсь просканировать строку слов и искать наличие конкретного слова (нечувствительности к регистру) в стиле XSLT 2.0 с использованием Regex.
У меня есть список слов, которые я хочу повторять и определить, существуют ли они в данной строке.
Я хочу сопоставить слово в любом месте в данном тексте, но Я не хочу совпадать в пределах слово (то есть поиск foo
должен нет совпадатьfoo
D »и поиск bar
должен нет соответствовать на "Rebar
").
REGEX XSLT 2.0 не имеет границы слова (\b
), поэтому мне нужно реплицировать его как можно лучше.
Решение
Вы можете использовать чередование, чтобы избежать повторения:
<xsl:if test="matches($prose, concat('(^|\W)', $word, '($|\W)'),'i')">
Другие советы
Если ваш процессор XSLT 2.0 является Saxon 9, вы можете использовать синтаксис регулярного выражения Java (включая b) с соответствующими функциями, токеризировать и заменить на запуск атрибута флага с помощью восклицательного знака:
<xsl:value-of select="matches('all foo is bar', '\bfoo\b', '!i')"/>
Майкл Кей недавно упомянул этот вариант на списке рассылки XSL.