Вопрос по regex, search – XPath: сопоставить целое слово (используя функцию совпадений с флагом без учета регистра)

5

Используя XPath, я бы хотел "Совпадение всего слова" (опция для пользователя, как в поиске VS).

Кажется, как будто функцииcontains а такжеmatches работать аналогично, хотя совпадения учитывают такие флаги, какi для нечувствительности к регистру.

Другими словами, я получаю одинаковые результаты с этими двумя запросами XPath:

<code><pets>
    <dog name="Rupert" color="grey"/>
    <dog name="Ralph" color="brown"/>
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>
    <cat name="Fluffy" color="black"/>
</pets>

Matches XPath: //cat[descendant-or-self::*[@*[matches(.,'Cat')]]]
    returns:
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>


Contains XPath: //cat[descendant-or-self::*[@*[contains(.,'Cat')]]]
    returns:
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>
</code>

Но я хотел бы использоватьmatches возвращать результаты, которые соответствуют & quot; Cat & quot; только целое слово:

<code><cat name="Cat" color="grey"/>
</code>

Как настроить запрос на совпадение, чтобы он соответствовал целому слову?

EDIT: I forgot to mention that I need to still use the matches function because I need the case insensitivity flag.

Ваш Ответ

5   ответов
2

match () выполняет сопоставление с регулярным выражением; Вы можете использовать его для соответствия подстроки или для соответствия всей строке с помощью якорей (^ cat $), и вы можете установить «i». флаг, чтобы сделать его слепым.

contains () делает точное совпадение подстроки; Вы можете использовать третий аргумент (сопоставление), чтобы запросить сопоставление без учета регистра, но способ определения параметров сопоставления зависит от процессора, который вы используете.

Оператор eq делает точное совпадение всей строки; «сортировка по умолчанию»; (который в случае XPath обычно устанавливается с использованием API процессора) может использоваться для запроса сопоставления без учета регистра. Похоже, что это то, что ближе всего к вашим требованиям, единственный недостаток в том, что указание параметров сортировки более зависит от системы, чем использование & quot; i & quot; флаг со спичками ().

2

Будет ли это работать для вас?

//cat[@*='Cat']
Не совсем то, что я ищу. Я все еще хочу использовать функцию соответствия, потому что мне нужна нечувствительность к регистру ... (см. Правку выше). developer
2

Cat" whole word only:

<cat name="Cat" color="grey"/>

There are different XPath expression that select the wanted element:

Использование:

/*/cat[matches(@name, '^cat$', 'i')]

Или используйте:

/*/cat[lower-case(@name) eq 'cat']

XSLT - based verification:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "/*/cat[matches(@name, '^cat$', 'i')]"/>
======
  <xsl:copy-of select=
   "/*/cat[lower-case(@name) eq 'cat']"/>

 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<pets>
    <dog name="Rupert" color="grey"/>
    <dog name="Ralph" color="brown"/>
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>
    <cat name="Fluffy" color="black"/>
</pets>

this transformation evaluates the two XPath expressions and copies the selected elements to the output:

  <cat name="Cat" color="grey"/>
======
  <cat name="Cat" color="grey"/>
1

Это:

//cat[@*='Cat']

результаты в:

<cat name="Cat" color="grey"/>

Я подтвердил использованиеXacobeo.

Не совсем то, что я ищу. Я все еще хочу использовать функцию соответствия, потому что мне нужна нечувствительность к регистру ... (см. Правку выше). developer
@developer Попробуйте это://cat[translate(@*,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='cat']  Это предполагает, что вы всегда передаете строку, которой хотите соответствовать, в нижнем регистре.
5

^ а также$ персонажи как якоря?

//cat[descendant-or-self::*[@*[matches(.,'^Cat$')]]]

ОтСинтаксис RegEx в XQuery 1.0 и XPath 2.0:

Two meta-characters, ^ and $ are added. By default, the meta-character ^ matches the start of the entire string, while $ matches the end of the entire string.

Хм .. это дает мне результат, который я хочу. Но не могли бы вы объяснить якоря ^ $? Я никогда не использовал их раньше ... developer
Спасибо, мне все еще нужно будет провести некоторое тестирование, но, похоже, это поможет! developer
В ответ добавлена ссылка, см. Раздел «Два метасимвола ...» раздел.

Похожие вопросы