См. Документацию о потребительских свойствах.
Установите ...consumer.max-attempts=1
, чтобы отключить повторную попытку.
Большая часть того, что я должен сказать, была обращена Adam и DGM, но я не думаю, что они отвечают на Ваш второй вопрос очень хорошо.
"как насчет всего очень легкого, чтобы понять, не компактный, не загадочный и сметь я говорю что довольно доменные языки там как SQL или LINQ?"
Я думаю, что хороший способ выразить ответ на это состоит в том, чтобы спросить, как Вы использовали бы английский язык для объяснения регулярного выражения?
<TAG\b[^>]*>(.*?)</TAG>
Ищите" <ТЕГ" граничный нуль слова или больше из чего-то, что не является'>' сопровождается'>', помнят нуль или больше из чего-то, останавливая в первом" </ТЕГ>"
Это - довольно простой regex. Английскую форму действительно легче понять? Вы могли добиться большего успеха?
Регулярные выражения трудно считать, но что Вы хотите от них, может быть так же твердо объяснить.
Как сказанный Adam, там что-нибудь лучше? Я дрожу для размышления о попытке сделать набор strcmp операций вместо хорошего regex. Как любой выразительный язык возможно злоупотребить regex и сделать очень нечитабельные конструкции, но часто даже на вид нечитабельный regex имеет намного больше смысла, чем эквивалентный процессуальный кодекс для достижения того же самого.
Без regex необходимо было бы записать собственную стандартную программу, чтобы проанализировать, отследить в обратном порядке, сравнить, сохранить индексы, сделать замены и управлять всеми результатами. Regex дает Вам всем это в очень выразительной форме. Мне не нравится повторять код, но если бы я должен был кодировать свой собственный синтаксический анализатор каждый раз, то когда я должен был искать умеренно сложный шаблон... Я не знаю то, что я сделал бы.
Да существуют различные разновидности regex, но большинство, самые популярные очень похожи, и безотносительно языка, в котором Вы используете их обычно, имеет документацию, чтобы помочь Вам считать его.
Регулярное выражение (по крайней мере первоначально) описывает регулярный язык. Регулярные языки имеют очень хорошие теоретические свойства в этом, они оба могут быть описаны и описать детерминированные конечные автоматы. DFAs для нетривиальных регулярных выражений являются болезненными для кодирования вручную.
Что еще более важно, компиляторы регулярного выражения, используемые в бэкэнде жемчуга, и т.д. очень хороши в том, что они делают. Было бы очень трудно вручить мелодию, соревновательно выполняющую код.
Наконец, их существование является в основном историческим артефактом. Они были около долгого времени, взяли долю завоеванного внимания, много людей знает их. Инструмент, который Вы имеете и что другие люди могут поддерживать, намного лучше, чем теоретический инструмент, который еще не существует.
Если это - просто синтаксис, который выключает Вас, возможно, необходимо рассмотреть рассмотрение синтаксического анализатора combinators в Haskell. Они могут выразить надмножество тех же идей и иметь более явный синтаксис.
Просмотр подобного вопроса, который Вы упомянули и его ответы, я видел несколько попыток создания "более дружественных" альтернативных синтаксисов, и от сторонников и от хулителей regexes, поскольку мы знаем их сегодня.
Я нашел, что они были однородно менее читаемы, чем эквивалентный regexes.
Теперь, предоставленный, я - обычный пользователь regexes, таким образом, я уверен, что мой комфорт с ними является значительной частью этого. Но моей основной проблемой с ними не было отсутствие близости, а скорее что они быстро стали слишком большими для принятия внезапно. Когда Ваш regex с 20 символами становится 10-line-by-30-column псевдоанглийским выражением, становится намного более трудным видеть, как части его касаются друг друга.
Возможно, кто-то придумает альтернативный синтаксис к regexes, который универсально более читаем, даже в сложных случаях, но я утверждаю, что такой синтаксис по сути потребовал бы некоторого эквивалента вызовам подпрограммы. Мы не пишем блоки с 200 строками кода приложения с 15 слоями вложенной логики, потому что это была бы неподъемная задача только для отслеживания логики его, не берите в голову выяснение, что это на самом деле делает. Если мы соберемся взорвать regexes в более подобную английскому языку форму, то та же самая проблема произойдет, и нам будут нужны те же инструменты для управления им.
Это - способ, которым это... главным образом по традиционным причинам, как Вы указали правильно. Теперь
Лично я нахожу regexps (по крайней мере раздел требуемый для стандартных задач) легкий взять.. день или 2. Усовершенствованные вещи сложны (вторая половина книги MasteringRegExp), но затем Вам не нужен он это часто также.
Подобного нотации BNF и т.п., основанию многих хороших спецификаций языка. Таким образом, это имеет смысл, что нотация как это использовалась бы в лексических анализаторах для указания на классы ожидаемых символов. Основные символы действительно не являются настолько загадочными.
Затем я думаю, что была UNIX-do-all-you-can-in-a-single-line идея, которая вступила во владение. После улучшений sed и grep сценариев, regexes получил новые полномочия, но краткие обозначения для них. Larry Wall включил их в Perl как общий инструмент для парсинга текста. Я предположил бы, что это сохранило компактность для острот, которые все еще были важны с жемчугом. И были краткие названия классов обычного символа, и еще больше питания спросили и дали regexes. Конечно, так как Perl был также языком модулей, regex синтаксис также работал в блоках операторов, и он усилил синтаксис, который был более широко известен.
Их присоединение к Java действительно что сделано людьми посмотреть на них, IMO. Java не сделал ничего для размещения их. И в результате выражения с обратными косыми чертами умеренной трудности превратились в густые джунгли обратных косых черт. Java дал регулярным выражениям новый рынок, если Вы будете, но он их самая зверская форма. Если Вы видели их и обратили не больше внимания, Вы могли бы думать, что regex является Вещью, Которая не Должна Быть.
Интересно, что, учитывая достаточно ясный синтаксис, для подробной версии Ambrose, кто-то мог придумать модуль для Perl, который мог взять подробный regex и "скомпилировать" его в компактный regex, который Perl понимает, с помощью более простого regexes через overload::constants
или возможно a Parse::RecDescent
грамматика.
Pyparsing (http://pyparsing.wikispaces.com/Examples) является библиотекой Python, которая помогает записать подобные regex выражения, которые очень читаемы, как эти строки, которые проанализируют "Привет, Мир!":
from pyparsing import Word, alphas
greet = Word( alphas ) + "," + Word( alphas ) + "!"
greet.parseString("Hello, World!")
Похоже, что библиотека очень близко к способности соответствовать питанию regexes (см. упомянутую выше страницу в качестве примера).
Я думаю, что подобный SQL язык регулярных выражений был бы захватывающим проектом. Я хотел бы видеть, что кто-то создает это.
Почему бы не язык, где можно записать
LOOK FOR "<TAG"
THEN WORDBOUNDARY THEN ZERO-OR-MORE NOT('>') FOLLOWED-BY '>'
THEN ZERO-OR-MORE SOMETHING REMEMBERED
THEN NEAREST "</TAG>"
Я не уверен, кто целевая аудитория, хотя - я не думаю, что использовал бы ее, потому что я потратил все это время изучение regexes.
Конечно, группа 'людей, которые должны использовать выражение в качестве комплекса как тот' в значительной степени карты к группе программистов, которые должны иметь дело с материалом так же, как комплекс и больше ежедневно?
работает!!
если существует легкий для чтения язык, который имеет расширения на каждом главном языке программирования и хорошо документируется и тестируется и не столь сжатый как regex, но ни один слишком подробный (подробный = раздражающий), я хотел бы знать больше об этом
Другая проблема с regex состоит в том, что существует много ароматов его. .NET regex по сравнению с php regex по сравнению с другим regex, весь взгляд одинаково, но не дает тот же результат (иногда никакой результат вообще).
Частью проблемы с regexes не является сам язык, но для чего люди пытаются использовать их. Они запишут строки и строки regexes, когда то, что они действительно хотят, будет довольно простым синтаксическим анализатором.
Regexes являются большими для простого к умеренно сложному соответствию подстроки и извлечению данных. Но в какой-то момент сложности Вы только что добрались, чтобы выкрикнуть компилятор компилятора и записать реальный синтаксический анализатор. Я думаю, что много людей не понимает, что regexes, прежде всего, для соответствия, не для того, чтобы сделать парсинг.
Я защитил бы regex синтаксис, потому что он (примерно) соответствует нотации, которую я изучил, когда я взял свой курс Алгоритмов и Машин. Это - простой способ генерировать машину для поглощения указанного регулярного языка.
regex синтаксис является способом, которым это - потому что это - действительно все, что необходимо полностью описать поведение, которое Вы ищете.
Необходимо смотреть на регулярные выражения как на высокопроизводительные электроинструменты (и я имею в виду инструменты питания в смысле строительной промышленности).
При создании небольшой рабочей таблицы для сарая Вы не вытаскиваете строительный пистолет, цепную пилу и промышленный маршрутизатор. Вы используете пилу, некоторые гвозди и молоток.
Точно так же Вы не создаете 30-этажное здание без подъемного крана там где-нибудь.
Идея состоит в том, чтобы использовать правильный инструмент для задания И правильный инструмент для Вашего уровня квалификации.
Если необходимо сократить дерево, удостоверьтесь, что Вы знаете все о вознаграждении перед запуском цепной пилы. Если Вы не делаете, то используйте руку, видел вместо этого, и сохраните себя прохождение в больницу, чтобы повторно прикрепить Вашу разъединенную конечность.
Я использую регулярные выражения путем, я использую свою цепную пилу - очень тщательно. Если Вы чувствуете себя неловко из-за инструмента, не используйте его. После того как Вы изучаете, как использовать его правильно, Вы найдете намного легче добиться цели быстрее.
Это - на самом деле заговор, увековеченный американской Ассоциацией Программистов На пенсии против сегодняшних молодых ничтожеств, которые получили первый опыт в Python и Java. Мы должны поддержать смысл страха и уважения к мистикам, ум которых преодолел проблемы крошечных базовых памятей и тайных языков с мнемоникой с 3 символами... и любил ее. В гору... оба пути... в снегу.:-)
Ваши контрдоводы являются показными. Вы знаете regex синтаксис, или Вы спорите от точки незнания? Это - важный момент для установления предвзятости.
Это нисколько не похоже на игру в гольф кода. Я не уверен в Вашем соединении там. Почему бы не жаловаться на указатели или что-то еще с помощью того же аргумента?
Компактность регулярного выражения не имеет никакого отношения к плохим именам переменной. Переменная, названная c, могла быть чем-либо. regex синтаксис не неоднозначен и не неопределенен. Это точно описывает свой шаблон.
Это - DSL. Таким образом, что, если это? Вы когда-либо пытались сделать сложные вещи в SQL? Это - большая путаница также. То, чтобы заставлять то же самое потребовать большего количества ввода и большего количества синтаксиса не улучшает ситуацию. У большинства людей, которых я учу, есть проблемы с regexes, потому что они не привыкли к размышлению в и разработке шаблонов, не потому что синтаксис экзотичен.
Легко понять, после того как Вы знаете это. Ну, это. Электроинструменты не оптимизированы для новичков или для людей, не желающих учиться. Я не жалуюсь на круглую скобку Lisp, но я не возражаю против regex синтаксиса.
Если Вы не хотите использовать регулярные выражения, то не делайте. Используйте функции обработки строк или синтаксические анализаторы. Используйте некоторый другой инструмент. В то время как Вы заняты этим, я буду десятью проблемами перед Вами, потому что я не плаваю против потока или обвиняю инструменты для работы, я не могу быть сделан.
Вам решать, сколько работы Вы хотите быть сделанными. Найдите инструмент, который получает Вас там самое быстрое, и изучите это. Если Вам не нравится это, изобретите что-то лучше. До тех пор прекратите жаловаться.
Посмотрите на другую сторону вопроса: как Вы разработали бы новый синтаксис, который воплощает все функции, непротиворечивость, краткость и устойчивость как regex, но более благоприятен для программиста?
Другие намекнули на это, но это переносит утверждение явно:
Регулярные языки не похожи на языки программирования. Они ближе к математической нотации.
Компактность и причудливость являются больше результатом попытки принудить точную нотацию из символов ASCII, чем преднамеренная попытка краткости или путаницы.