Когда лучше использовать Регулярные выражения по основному строковому разделению / substring'ing?

18
задан Cœur 16 November 2018 в 04:55
поделиться

7 ответов

Моя основная инструкция должна использовать регулярные выражения для одноразового кода, и для проверки ввода данных пользователем. Или когда я пытаюсь найти определенный шаблон в большом шарике текста. В большинстве других целей я запишу грамматику и реализую простой синтаксический анализатор.

Одна важная инструкция (это действительно трудно обойти, хотя я вижу, что люди пробуют все время), должна всегда использовать синтаксический анализатор в случаях, где грамматика выходного языка является рекурсивной.

, Например, считайте крошечный "язык выражения" для оценки parenthetized арифметическими выражениями. Примеры "программ" в этом языке были бы похожи на это:

1 + 2
5 * (10 - 6)
((1 + 1) / (2 + 2)) / 3

грамматику А легко записать и выглядит примерно так:

DIGIT := ["0"-"9"]
NUMBER := (DIGIT)+
OPERATOR := ("+" | "-" | "*" | "/" )
EXPRESSION := (NUMBER | GROUP) (OPERATOR EXPRESSION)?
GROUP := "(" EXPRESSION ")"

С той грамматикой, можно создать синтаксический анализатор с рекурсивным спуском в один миг.

эквивалентное регулярное выражение ДЕЙСТВИТЕЛЬНО трудно для записи, потому что регулярные выражения обычно не имеют очень хорошей поддержки рекурсии.

Другим хорошим примером является прием пищи JSON. Я видел, что люди пытаются использовать JSON с регулярными выражениями, и это БЕЗУМНО. Объекты JSON являются рекурсивными, таким образом, они просто просят о регулярных грамматиках и синтаксических анализаторах с рекурсивным спуском.

<час>

Hmmmmmmm... Смотря на ответы других людей, я думаю, что, возможно, ответил на неправильный вопрос.

я интерпретировал его как, "когда использование должно использовать простой regex, а не полноценный синтаксический анализатор?" тогда как большинство людей, кажется, интерпретировало вопрос как, "когда должен Вы самокрутка неуклюжая специальная познаковая схема проверки, вместо того, чтобы использовать регулярное выражение?"

, Учитывая, что интерпретация, мой ответ: никогда.

<час>

Хорошо.... еще одно редактирование.

я буду немного более прощающим из схемы самокрутки. Просто... не называйте это "парсингом": o)

я думаю хорошее эмпирическое правило, - то, что необходимо только использовать примитивы сопоставления строк, если можно реализовать ВСЮ логику с помощью единственного предиката. Как это:

if (str.equals("DooWahDiddy")) // No problemo.

if (str.contains("destroy the earth")) // Okay.

if (str.indexOf(";") < str.length / 2) // Not bad.

, После того как Ваши условия содержат несколько предикатов, затем Вы начали изобретать свой собственный специальный строковый язык проверки, и необходимо, вероятно, просто проявить мужество и изучить некоторые регулярные выражения.

if (str.startsWith("I") && str.endsWith("Widget") &&
    (!str.contains("Monkey") || !str.contains("Pox")))  // Madness.

Регулярные выражения действительно не это трудно для изучения. По сравнению с huuuuge полнофункциональным языком как C# с десятками ключевых слов, типов примитивов, и операторов и стандартной библиотекой с тысячами классов, регулярные выражения являются абсолютно простой грязью. Большинство regex реализаций поддерживает приблизительно приблизительно дюжину операций (плюс-минус).

Вот большая ссылка:

http://www.regular-expressions.info /

пз: В качестве награды, если Вы когда-нибудь делаете , хотят узнать о записи Ваших собственных синтаксических анализаторов (с lex/yacc, ANTLR, JavaCC или другими подобными инструментами), изучение, что регулярные выражения являются большой подготовкой, потому что инструменты парсера-генератора используют многие из тех же принципов.

22
ответ дан 30 November 2019 в 07:50
поделиться

regex может быть

  • легче понять
  • экспресс более ясно намерение
  • намного короче
  • легче измениться/адаптировать

В некоторых ситуациях, все те преимущества были бы достигнуты при помощи regex, в других только некоторые достигаются (regex не действительно легко понять, например), и во все же других ситуациях regex более трудно понять, запутывает намерение, дольше и трудно измениться.

, Чем больше из тех (и возможно другой) способствует, я получаю от regex, тем более вероятно я должен использовать их.

Возможное эмпирическое правило: если понимание regex заняло бы минуты для кого-то, кто несколько знаком с регулярными выражениями, затем Вы не хотите использовать его (если "нормальный" код не является еще более замысловатым ;-).

гм... все еще никакое простое эмпирическое правило, извините.

6
ответ дан 30 November 2019 в 07:50
поделиться

[W]e're, оценивая действие заголовка мыла и принимая решения о том

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

Для ответа на вопрос в целом использование регулярных выражений должно быть минимизировано, поскольку они не очень читаемы. Часто можно объединить строковый парсинг и регулярные выражения (возможно, в цикле) для создания большого простого решения, чем одни только регулярные выражения.

2
ответ дан 30 November 2019 в 07:50
поделиться

Когда Ваше необходимое преобразование не является основным - но является все еще концептуально простым.

никакая причина вытащить Regex, если Вы делаете прямую строковую замену, например... ее более легкое, чтобы просто использовать строку. Замена

, с другой стороны, сложное правило со многими условными выражениями или особыми случаями, которые взяли бы больше чем 50 символов regex, может быть кошмаром для поддержания позже, если Вы явно не пишете это

1
ответ дан 30 November 2019 в 07:50
поделиться

Я согласился бы с тем, какой сказанный benjismith, но хотят разработать просто немного. Для очень простых синтаксисов основной строковый парсинг может работать хорошо, но regexes - также. Я не назвал бы их излишеством. Если это работает, это работает - идут с тем, что Вы находите самыми простыми. И для умеренного к промежуточному строковому парсингу, regex обычно является способом пойти.

, Как только Вы начинаете нуждаться для определения грамматики однако, т.е. сложного строкового парсинга, возвращаются к использованию своего рода конечного автомата или подобных так быстро, как Вы можете. Regexes просто не масштабируются хорошо, для использования термина свободно. Они становятся сложными, трудно для интерпретации, и даже неспособный.

я видел по крайней мере один проект, где использование regexes продолжало расти и расти, и скоро они испытали затруднения при вставке новой функциональности. Когда это наконец прибыло время, чтобы сделать новую главную версию, они вывели весь regexes и пошли путем синтаксического анализатора грамматики.

1
ответ дан 30 November 2019 в 07:50
поделиться

Я всегда использовал бы regex, если это не что-то очень простой, такие как разделение разделенной от запятой строки. Если я буду думать, что существует шанс, строки могли бы однажды стать более сложными, то я, вероятно, запущу с regex.

я не подписываюсь на представление, что regexes тверды или сложны. Это - один инструмент, который каждый разработчик должен изучить и изучить хорошо. У них есть несметное число использования, и когда-то изученный, это - точно вид вещи, о которой Вы никогда не должны волноваться никогда снова.

Regexes редко являются излишеством - если соответствие просто, regex - также.

0
ответ дан 30 November 2019 в 07:50
поделиться

Я думал бы самый легкий способ знать, когда использовать регулярные выражения и если не к, когда Ваш поиск строки требует Условного оператора или чего-либо напоминающего это или что логика, затем Вам нужно что-то лучше, чем сравнение простой строки, которое является, где regex сияет.

0
ответ дан 30 November 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: