Соответствующие операторы - PullRequest
2 голосов
/ 12 марта 2012

У меня есть текстовый ввод, содержащий множество операторов, переменных и английских слов.Из этого ввода я должен отдельно отделить все операторы.

На данный момент я использую сопоставление с регулярным выражением, поэтому число сопоставляемых операторов зависит от регулярного выражения.проблема, которую я получаю: '= соответствует <=', '& соответствует &&'.Мне нужно сопоставить оба = и <= по отдельности. </p>

Есть ли лучший способ сопоставления операторов, кроме регулярных выражений?

Ответы [ 5 ]

2 голосов
/ 12 марта 2012

Что касается регулярных выражений, вы можете сначала сделать так, чтобы шаблон соответствовал специальному (составному) случаю, а затем - универсальный вариант с простым чередованием. В вашем простом случае ввода: /<=|&&|=|&/. это не обязательно ужасно, после этого вы можете поставить все, что вам нужно: /special1|...specialN|special-chars-catch-all/

эта техника может быть полезна в некоторых случаях, когда жадное выражение просто получит все, например: if($x==-1), вы бы хотели ==, а не ==-

1 голос
/ 13 января 2014

Посмотрите расширенные варианты на вашем языке RE.

В большинстве языков RE / [<] (?! [=]) / Будет соответствовать "<", но не "<=" и не "=", например. (?! ...) означает «кроме случаев, когда следуют ...». Термин для этого <strong>Отрицательное прогнозное утверждение . Иногда они пишутся по-разному, так как они менее стандартны, чем большинство других образований, но они обычно доступны. Они никогда не потребляют больше символов, но создают более медленные совпадения.

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

0 голосов
/ 13 января 2014

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

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

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

0 голосов
/ 12 марта 2012

Там, вероятно, есть. Но в качестве альтернативы вы можете использовать свое регулярное выражение в виде (например,):

[><=&|]+

(Изменить в соответствии со своими спецификациями - не уверен, хотите ли вы сложения, вычитания, ++ для увеличения и т. Д.).

+ означает «один или несколько», поэтому регулярное выражение соответствует как можно большему числу символов. Это означает, что если в тексте указано <=, то оно будет соответствовать <=, а не <, а затем =.

Тогда только после того, как вы извлечете все совпадения, переберите их все и классифицируйте их.

0 голосов
/ 12 марта 2012

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

Если вы хотите полностью отказаться от него, пожалуйста, прости меня и проигнорируйте мое предложение:)

Если вы хотите использовать регулярное выражение для обнаружения просто =, тогда вы можете использовать [^<>=]=[^<>=], что означает «совпадать с равными только тогда, когда ему не предшествует или не отделяется <> или другим =.

Вы можете использовать {1}& с амперсандами для обнаружения одного (и только одного) амперсанда.

(Примечание: вам может понадобиться экранировать пару символов с помощью \)

Надеюсь, это может помочь. Удачи.

* К. * 1018

...