Ответ 1
Вы не можете использовать ^
и $
в классах символов так, как вы пожелаете, - они будут интерпретироваться буквально, но вы можете использовать чередование для достижения того же эффекта:
(^|,)garp(,|$)
Выполняя небольшую задачу с регулярным выражением, я столкнулся с этой проблемой. У меня есть строка, которая представляет собой список тегов, который выглядит, например, следующим образом:
foo,bar,qux,garp,wobble,thud
Мне нужно было проверить, есть ли какой-либо тэг, например. "garp" был в этом списке. (То, что он окончательно совпадает, не очень важно, просто если есть совпадение или нет.)
Моя первая и немного глупая попытка в этом заключалась в использовании следующего регулярного выражения:
[^,]garp[,$]
Моя идея заключалась в том, что перед "garp" должно быть либо начало строки/строки, либо запятая, после "garp" должна быть либо запятая, либо конец строки/строки.
Теперь, сразу же очевидно, что это регулярное выражение неверно: и ^, и $изменяют свое поведение в контексте класса символов [].
В итоге я пришел к следующему:
^garp$|^garp,|,garp,|,garp$
Это регулярное выражение просто обрабатывает 4 случая по одному. (Тег в начале списка, в центре, в конце или в качестве единственного элемента списка.) Последнее регулярное выражение как-то немного уродливо в моих глазах и просто ради удовольствия, я хотел бы сделать это немного более элегантный.
Есть ли способ, как начало символа строки/конца строки (^ и $) можно использовать в контексте классов символов?
EDIT: Хорошо, еще одна информация была желательна, так вот: Я использую это в инструкции Oracle SQL. Это, к сожалению, не допускает никаких утверждений о взгляде, но поскольку меня интересует только наличие совпадения или нет (а не то, что соответствует), это не влияет на меня здесь. Теги могут содержать не-алфавитные символы, такие как - или _ so\bgarp\b, не будут работать. Также один тег может содержать другой тег, как сказал SilentGhost, так что /garp/doesnt тоже работает.
Вы не можете использовать ^
и $
в классах символов так, как вы пожелаете, - они будут интерпретироваться буквально, но вы можете использовать чередование для достижения того же эффекта:
(^|,)garp(,|$)
вам просто нужно использовать границу слова (\b
) вместо ^
и $
:
\bgarp\b
Просто используйте look-arounds, чтобы решить эту проблему:
(?<=^|,)garp(?=$|,)
Разница с внешними элементами и просто регулярными группами состоит в том, что с регулярными группами запятая будет частью матча, а с обходками она не будет. В этом случае это не имеет значения.
Я большой поклонник регулярных выражений, но в этом случае (строка с разделителями-запятыми), хотя оба решения Mark Byers, SilentGhost и reko_t работают, я предпочел бы взглянуть на парсер CSV.
Может быть, излишним для работы, но тогда мы не знаем реальных требований и реальных данных, которые нужно обрабатывать.
Это может быть немного оптимизировано с помощью функции SQL INSTR
(позиция строки), ей не требуется Regex.
Просто проверьте, есть ли/или:
garp
(единственный элемент в списке)garp,
находится в позиции 1 (т.е. 0-позиция) строки (первый элемент в списке),garp
находится в позиции LENGTH(string)
- LENGTH(',garp')
[1] (последний элемент в списке),garp,
вообще (в середине списка)[1] Возможно, здесь есть ошибка "один за другим"