Comments 38
А где хаб «ненормальное программирование»? Обычно для таких вещей пишут что‐то вроде парсера: ищем с помощью той же регулярки начальный символ, потом по символу проходим по регулярному выражению (здесь, скорее всего, будет какой‐нибудь конечный автомат). Или не по символу, а регулярками ищем следующий «интересный» символ: т.е. одну из скобок (если ограничитель — скобки), обратную косую черту, ограничитель, на основании найденного принимаем решение: изменить состояние, вернуть найденную регулярку, просто искать дальше.
var reg = new Regex("Данный комментарий вполне себе является полноценным регулярным выражением");
var match = reg.Match("вфытдтфыплдвфыьпр Данный комментарий вполне себе является полноценным регулярным выражением лвофылповфыповфы джповдфы");
Console.WriteLine(match.Value);
Console.ReadKey();
Вывод:
Так что зависит от инструмента. В моем является.
(Вообще часто наблюдаю такой глюк для авторов, только что опубликовавшихся из песочницы и которым пытаюсь плюсануть в карму. Вроде как одна публикацияя уже есть, но сообщается что нет...)
Странно, что нельзя было сразу.
Экранировать — значений несколько. Одно из них «экранирование символов» — замена в тексте управляющих символов на соответствующие текстовые подстановки.
Извините. Но замена одного слова совершенно другим, это не просто опечатка.
<?php
$re = <<<REG
/#©Yuri Khmelenko
#Ограничитель 1
((\\<)|(\\()|(\\[)|(\\{)|
((?=[[:ascii:]])[^\\s\\w\\\\\\)\\]\\}\\>]))
#Шаблон
((?#ignore comments like this in the regular expression)
(?(6)
(?(?=(?:(?!\\6).|(?<=\\\\)\\6)*[^\\\\][\\(][\\?][\\#])
(?:(?!\\6).|(?<=\\\\)\\6)*[^\\\\][\\(][\\?][\\#]
[^\\)]*(?-1)))
.*?)
#Ограничитель 2
#экранизированные обратные слеши +
#неэкранизированный ограничитель
(?(2)(?<!(?<!(?<!(?<!(?<!(?<!(?<!(?<!\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\>)
(?(3)(?<!(?<!(?<!(?<!(?<!(?<!(?<!(?<!\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\))
(?(4)(?<!(?<!(?<!(?<!(?<!(?<!(?<!(?<!\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\])
(?(5)(?<!(?<!(?<!(?<!(?<!(?<!(?<!(?<!\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\})
(?(6)(?<!(?<!(?<!(?<!(?<!(?<!(?<!(?<!\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\\\)\\6)
#Модификаторы шаблонов
#PHP [mixXsuUAJ] JavaScript [gmi] python [gmixsu]
((?(6)(?:[mixXsuUAJ]*)|(?(?=.*?[mixXsuUAJ]+)[mixXsuUAJ]+)))/xs
REG;
preg_match_all($re, $re, $matches);
var_dump($matches);
?>
Вы излишне все усложнили в итоге получили нечитаемое выражение и ложные срабатывания вроде https://regex101.com/r/mS2vZ8/2
На самом деле регулярное выражение, которое решит данную задачу будет не особо трэшевым.
Я сохранил Ваши определения ограничителей и флагов, но само выражение гораздо проще:
https://regex101.com/r/mS2vZ8/3
(?(DEFINE)
(?P<realEnd>
(?(3)\>)
(?(4)\))
(?(5)\])
(?(6)\})
(?(7)\7)
)
)
#Ограничитель 1
((\<)|(\()|(\[)|(\{)|
((?=[[:ascii:]])[^\s\w\\\)\]\}\>]))
#Шаблон
(
(?:
\\. | # что-то экранированое ИЛИ
(?!(?P>realEnd)). # что угодно кроме ограничителя
)*+
)
#Ограничитель 2
(?P>realEnd)
#Модификаторы шаблонов
#PHP [mixXsuUAJ] JavaScript [gmi] python [gmixsu]
((?:[mixXsuUAJ]*)|(?(?=.*?[mixXsuUAJ]+)[mixXsuUAJ]+))
И у Вас еще одно заблуждение.
Посмотрел последнюю ревизию регулярки- там Вы считаете, что в комментариях (?# / )
может быть ограничитель.
Это неверное мнение. Даже в комментариях ограничитель надо экранировать:
http://ideone.com/rhVCb7
Ну конечно добавляйте.
Если будете добавлять, то эту версию- https://regex101.com/r/mS2vZ8/4 немного лучше производительность.
Поиск регулярных выражений с помощью регулярных выражений