Pull to refresh

Comments 38

А где хаб «ненормальное программирование»? Обычно для таких вещей пишут что‐то вроде парсера: ищем с помощью той же регулярки начальный символ, потом по символу проходим по регулярному выражению (здесь, скорее всего, будет какой‐нибудь конечный автомат). Или не по символу, а регулярками ищем следующий «интересный» символ: т.е. одну из скобок (если ограничитель — скобки), обратную косую черту, ограничитель, на основании найденного принимаем решение: изменить состояние, вернуть найденную регулярку, просто искать дальше.

Добавил хаб «ненормальное программирование», просто не знал что есть такой)
А почему именно регуляркой искать, почему не парсить конечным автоматом? Будет ведь проще даже не на порядок, а на два, и, в отличие от этой регулярки, потом еще и поддерживать можно будет.
Я вас разочарую, но нет, не проще. Отловить регулярное выражение конечным автоматом, увы, нельзя. В принципе. Строго говоря и регулярными выражениями нельзя — но математическими. Скорее всего теми, которые в PCRE можно, так как они «шире» (и, соответственно, в конечные автоматы не конвертируются).
Так-то регулярные выражения и ДКА эквивалентны.
В предыдущем комментарии написано же — то, что обычно называется регулярными выражениями в языках программирования имеет более широкие возможности, чем «математические» регулярные выражения.
Данный комментарий вполне себе является полноценным регулярным выражением
Не является, открывающие символы отсутствуют.
var reg = new Regex("Данный комментарий вполне себе является полноценным регулярным выражением");
var match = reg.Match("вфытдтфыплдвфыьпр Данный комментарий вполне себе является полноценным регулярным выражением лвофылповфыповфы джповдфы");
Console.WriteLine(match.Value);
Console.ReadKey();


Вывод:


Так что зависит от инструмента. В моем является.
Нет, я понимаю, о чем вы. Можно и в Python сделать re.compile("foobar"). Просто автор ищет регулярки /в перловом (?:стиле)/ugi, о чем он и пишет в начале статьи.
Ну если настолько усложнить условия, то у меня в первую же секунду было бы готово решение /(.*)/s

Не‐а. (unbalanced — не регулярное выражение в синтаксисе PCRE. Но всё равно будет несколько проще.

Вот уж действительно — «Однажды у программиста появилась проблема и он решил использовать регулярные выражения чтобы её решить. Теперь у него 2 проблемы.»
ну это на первых порах))) потом они только помогают))
Кто нибудь в курсе, почему я автору не могу поставить плюс в карму? Появляется странное сообщение: «Нельзя голосовать за пользователей, у которых нет размещённых публикаций»

(Вообще часто наблюдаю такой глюк для авторов, только что опубликовавшихся из песочницы и которым пытаюсь плюсануть в карму. Вроде как одна публикацияя уже есть, но сообщается что нет...)
Я кстати даже никому не могу поставить ни плюса ни минуса — кармы 0,0. Может защита какая-нибудь.
UFO just landed and posted this here
уже аж целых три прилетело)
Ну всё, процесс пошёл.

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

Не закроют. В любой момент содержимое поста Вы сможете изменить на противоположное или вообще удалить все символы и даже статью.
спасибо, плюсик потом поставлю, а то пишут уже что заряда нет)))
Экранизировать — осуществлять экранизацию. Экранизация — интерпретация средствами кино произведений другого вида искусства. Казалось бы, при чем здесь программирование?

Экранировать — значений несколько. Одно из них «экранирование символов» — замена в тексте управляющих символов на соответствующие текстовые подстановки.

Извините. Но замена одного слова совершенно другим, это не просто опечатка.
Всё верно. Спасибо, исправил.
о, а вам тоже не нравится когда вместо слова «функциональность» используют математический термин «функционал»?
UFO just landed and posted this here
Первая найдёт, вторая теоретически — да: https://regex101.com/r/bZ4bR2/17 (34679шага), а практически, могут возникнуть всякие неприятности при стандартных настройках, например 101 ошибка: ERR_CONNECTION_RESET.
php
<?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

ну если честно у меня сейчас голова не может вспомнить что я там считал или просто допускал. В любом случае огромное спасибо, вы очень помогаете!
О! Ну вы право молодец, хорошая работа. Если вы не против я бы хотел добавить это в статью.
добавил, всё руки никак не доходили, но без разъяснений (не все смогут понять что там и как работает), к сожалению времени на это нет(
Sign up to leave a comment.

Articles