Подтвердить что ты не робот

Регулярное выражение: используйте начало строки/конца строки (^ или $) в другом контексте

Выполняя небольшую задачу с регулярным выражением, я столкнулся с этой проблемой. У меня есть строка, которая представляет собой список тегов, который выглядит, например, следующим образом:
  foo,bar,qux,garp,wobble,thud

Мне нужно было проверить, есть ли какой-либо тэг, например. "garp" был в этом списке. (То, что он окончательно совпадает, не очень важно, просто если есть совпадение или нет.)

Моя первая и немного глупая попытка в этом заключалась в использовании следующего регулярного выражения:
  [^,]garp[,$]

Моя идея заключалась в том, что перед "garp" должно быть либо начало строки/строки, либо запятая, после "garp" должна быть либо запятая, либо конец строки/строки.

Теперь, сразу же очевидно, что это регулярное выражение неверно: и ^, и $изменяют свое поведение в контексте класса символов [].

В итоге я пришел к следующему:
  ^garp$|^garp,|,garp,|,garp$

Это регулярное выражение просто обрабатывает 4 случая по одному. (Тег в начале списка, в центре, в конце или в качестве единственного элемента списка.) Последнее регулярное выражение как-то немного уродливо в моих глазах и просто ради удовольствия, я хотел бы сделать это немного более элегантный.

Есть ли способ, как начало символа строки/конца строки (^ и $) можно использовать в контексте классов символов?

EDIT: Хорошо, еще одна информация была желательна, так вот: Я использую это в инструкции Oracle SQL. Это, к сожалению, не допускает никаких утверждений о взгляде, но поскольку меня интересует только наличие совпадения или нет (а не то, что соответствует), это не влияет на меня здесь. Теги могут содержать не-алфавитные символы, такие как - или _ so\bgarp\b, не будут работать. Также один тег может содержать другой тег, как сказал SilentGhost, так что /garp/doesnt тоже работает.

4b9b3361

Ответ 1

Вы не можете использовать ^ и $ в классах символов так, как вы пожелаете, - они будут интерпретироваться буквально, но вы можете использовать чередование для достижения того же эффекта:

(^|,)garp(,|$)

Ответ 2

вам просто нужно использовать границу слова (\b) вместо ^ и $:

\bgarp\b

Ответ 3

Просто используйте look-arounds, чтобы решить эту проблему:

(?<=^|,)garp(?=$|,)

Разница с внешними элементами и просто регулярными группами состоит в том, что с регулярными группами запятая будет частью матча, а с обходками она не будет. В этом случае это не имеет значения.

Ответ 4

Я большой поклонник регулярных выражений, но в этом случае (строка с разделителями-запятыми), хотя оба решения Mark Byers, SilentGhost и reko_t работают, я предпочел бы взглянуть на парсер CSV.

Может быть, излишним для работы, но тогда мы не знаем реальных требований и реальных данных, которые нужно обрабатывать.

Ответ 5

Это может быть немного оптимизировано с помощью функции SQL INSTR (позиция строки), ей не требуется Regex.

Просто проверьте, есть ли/или:

  • Если строка равна garp (единственный элемент в списке)
  • Если garp, находится в позиции 1 (т.е. 0-позиция) строки (первый элемент в списке)
  • Если ,garp находится в позиции LENGTH(string) - LENGTH(',garp') [1] (последний элемент в списке)
  • Если строка содержит ,garp, вообще (в середине списка)

[1] Возможно, здесь есть ошибка "один за другим"