Как я могу использовать регулярные выражения для сопоставления всех символов, включая кавычки? - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь написать регулярное выражение, которое будет соответствовать всем трем из следующих стилей шаблона:

[ATTACH]

[ATTACH type="full"]

[ATTACH type="full" alt="3vmw5j.jpg"]

«full» и «3vmw5j.jpg» в приведенном выше примере будут отличаться в производственном процессе. и показаны только в качестве примеров. Регулярное выражение должно предполагать, что это будут полные символы a-zA-Z0-9 с точкой для имени файла.

Я пробовал это сделать, однако он соответствует только первому.

/\[ATTACH(?>=\w+)?\]

Я также попробовал это в онлайн-тестировщиках регулярных выражений, и они возвращают 3 совпадения, за исключением того, что единственное совпадение в файле .rb, который я запускаю, остается первым.

/\[ATTACH(.*)?\]

По общему признанию, Я не очень часто использую рефлекс. Заранее спасибо за любую помощь!

Ответы [ 4 ]

0 голосов
/ 23 апреля 2020

В случае, если вы хотите сопоставить любой тег ATTACH с атрибутами или без атрибутов (и эти атрибуты не обязательны, как в вашем примере), более простой альтернативой может быть:

\[ATTACH\b[^\]]*\]

Объяснил:

\[       # Literal '['
ATTACH   # Literal 'ATTACH'
\b       # 'Bareword' (to make sure we don't find ATTACH in [ATTACHMENT], for example)
[^\]]*   # Any non-']' character repeated 0 or more times
\]       # Literal ']'

У вас есть демо здесь .

0 голосов
/ 23 апреля 2020

@ Дай предоставил ответ на ваши требования к шаблону. Я думаю, проблема в том, как вы передаете шаблон в функцию или объект regex / re match.

Если в вашем шаблоне есть двойные кавычки, вам нужно разбивать строку шаблона на несколько частей до и после кавычек. а затем заменить кавычки (") с помощью функции CHR или CHRW (в зависимости от того, что работает), а затем объединить и передать эту строку в качестве параметра вашей функции.

Использование выражения @Dai s

Pattern = [ATTACH \ s * (тип = CHR (34) .toString (?. +?) CHR (34) .toString)? \ s * (alt = CHR (34) .toString (?. +?) CHR (34) .toString )?]

Не забудьте удалить пробелы.

0 голосов
/ 23 апреля 2020

Если вы хотите сопоставить необязательные пары ключ / значение в любом порядке, и значение может быть символами слова с необязательными точками, где точки не могут быть в начале или конце строки:

\[ATTACH(?: \w+="\w+(?:\.\w+)*")*]

Объяснение

  • \[ATTACH Соответствие [ATTACH
  • (?: Группа без захвата
    • \w+= Соответствие пробелу, 1 + символы слова и =
    • "\w+ Совпадение " и символы 1+
    • (?:\.\w+)*" При желании повторить точку и 1+ слова
  • )* Закрыть группу без захвата и повторить 0+ раз, если есть несколько точек
  • ] Совпадение ]

Regex demo

0 голосов
/ 23 апреля 2020

Это работает для меня в регулярных выражениях со вкусом ECMAScript:

\[ATTACH\s*(type="(?<type>.+?)")?\s*(alt="(?<alt>.+?)")?\]

Попробуйте на Regex101.com: https://regex101.com/r/Z9RryV/1

Значение type="" и alt="" атрибуты сохраняются в именованных снимках type и alt соответственно.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...