Чувствителен к регистру и нечувствителен в той же схеме - PullRequest
8 голосов
/ 25 июня 2010

Благодаря помощи с моим предыдущим домашним заданием Regex to match tags like <A>, <BB>, <CCC> but not <ABC>, но теперь у меня есть еще один домашний вопрос.

Мне нужно сопоставить теги, такие как <LOL>, <LOLOLOL> (3 заглавные буквы, с повторяемыми двумя последними буквами), но не <lol> (необходимо вводить заглавные буквы).

Используя технику из предыдущего домашнего задания, я попробовал <[A-Z]([A-Z][A-Z])\1*>. Это работает, за исключением того, что есть дополнительный улов: повторяющаяся часть может быть в смешанном регистре!

Так что мне нужно также сопоставить <LOLolol>, <LOLOLOlol>, потому что это 3 заглавные буквы с повторяемыми двумя последними буквами в смешанном регистре. Я знаю, что вы можете сделать шаблон нечувствительным к регистру с помощью /i, и это позволит мне сопоставить <LOLolol> с имеющимся у меня регулярным выражением, но теперь оно также будет соответствовать <lololol>, поскольку проверка для первых 3 букв также нечувствительны к регистру.

Так как мне это сделать? Как я могу проверить первые 3 буквы регистр, а затем остальные буквы без учета регистра? Это возможно с регулярным выражением?

1 Ответ

7 голосов
/ 25 июня 2010

Да! На самом деле вы можете сделать это в некоторых вариантах, используя так называемый встроенный модификатор. Это помещает модификатор в шаблон, и вы можете по существу выбрать, к каким частям шаблона применяются модификаторы.

Встроенный модификатор нечувствительности к регистру (?i), поэтому шаблон, который вам нужен в этом случае:

<[A-Z]([A-Z]{2})(?i:\1*)>

Ссылки

  • regular-expressions.info / Модификаторы
    • Указание режимов внутри регулярного выражения
      • Вместо /regex/i вы также можете сделать /(?i)regex/
    • Включение и выключение режимов только для части регулярного выражения
      • Вы также можете сделать /first(?i)second(?-i)third/
    • Модификатор Spans
      • Вы также можете сделать /first(?i:second)third/
...