2016-02-12 8 views
0

У меня возникли проблемы с попыткой реализовать некоторое регулярное выражение. Мне нужно захватить все, кроме одного конкретного оператора. Таким образом, это формат, по существу:захватить все, кроме определенного регулярного выражения

оператор фракции фракция

Это текущее регулярное выражение:

([ \t]*-?[0-9]+[ \t]*/[ \t]*-?[0-9]+[ \t]*) 

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

-12/43 - 3/-5 

Было бы захватить -12/43 и 3/-5. Мне нужно, чтобы все это захватывало; Мне нужно, чтобы захватить оператора посередине.

Я искал какое-то время, но у меня разные ответы, подробно описывающие, как это сделать. Любая помощь будет принята с благодарностью!

+0

Вы думаете о '^'? –

+0

Всегда только 2 "значения", разделенные оператором? если нет, то какие другие варианты? – Enissay

ответ

0

Достаточно простой способ сделать то, что вы просите, это просто заменить ваши фракции "" - тогда все, что у вас осталось, это оператор.

Pattern fraction = Pattern.compile("\\s*-?\\d+\\s*/\\s*-?\\d+\\s*"); 
Matcher matcher = fraction.match(myExpression); 
String operator = matcher.replaceAll("").trim(); 

operator переменная теперь исходное выражение со всеми подстрок, соответствующих шаблону фракции удалены.

Обратите внимание, что я использовал предопределенные классы символов для пробелов и цифр.

Хотя это должно работать, я не рекомендую этот подход. Предполагая, что вы захотите что-то сделать с выражением (например, оцените его), вам намного лучше использовать правильную лексическую методику семантического анализа &. Существуют сторонние библиотеки (например, JFlex), которые могут выполнять эту работу с минимальными усилиями и гораздо большей гибкостью.

+0

В этом случае лучше использовать 'String.replaceAll'? –

+0

@ScaryWombat Личные предпочтения, но я стараюсь, чтобы мои шаблоны 'static'' final', как и любые другие константы, а не встраивались в инструкцию. Но вы, вероятно, правы, что это сделало бы ответ немного проще. – sprinter

+0

Я пробовал ваш метод, и он работал, кроме одной части. Я пробовал такие выражения: 1/2-1/2. Он должен быть 1/2 минус 1/2, но вместо этого выбирает его как 1/2 (отрицательный) 1/2. Этот «1/2- 1/2» будет работать, но «1/2 -1/2» не будет. – Godfried23

0

Попробуйте использовать группу захвата:

/(?:\s*-?\d+\s*\/\s*-?\d+)\s*([*/+-])\s*(?:\s*-?\d+\s*\/\s*-?\d+)/ig 

Я объясню, что здесь происходит. У нас есть три группы захвата: 2, которые не захватывают группы (?:.*) и одну группу захвата (.*). Нехватывающие группы окружают фракции, которые вы игнорируете, в то время как группа захвата окружает оператора, которого вы ищете [*/+-]. Теперь вы можете получить оператору:

Pattern pattern = Pattern.compile("(?:\\s*-?\\d+\\s*\\/\\s*-?\\d+)\\s*([*/+-])\\s*(?:\\s*-?\\d+\\s*\\/\\s*-?\\d+)"); 
Matcher matcher = pattern.match(whatAreWeMatching); 
String operator = matcher.group(1); // returns "-" with the example you gave 

Обратите внимание, что я также включал много проверок на пробельных \s*, так что вы можете свободно ставить пробелы между любым оператором. Без проверки пробела регулярное выражение выглядело бы намного меньше, но не учитывало бы такие вещи, как -21/12 + 14/-5. Если вы уверены, что ваш вклад будет иметь только структуру, которую вы показали нам, вы можете использовать:

/(?:-?\d+\/-?\d+) ([*/+-]) (?:-?\d+\/-?\d+)/ig 

(Только не забудьте добавить дополнительный обратный слэш ко всем обратной косой черты, прежде чем положить это в строку.)

0

Если у вас есть всегда входы этих структур: values separated by single operators, то я просто добавляется к вашему выражению в ветви чере, чтобы захватить этот оператор:

|(\S) или |([+-*/]), если вы уже знаете, что эти операторы должны быть.

Что дает:

([ \t]*-?[0-9]+[ \t]*/[ \t]*-?[0-9]+[ \t]*)|(\S) 

DEMO

Примечание: OFC вы должны бежать slaches в вашем коде соответственно !!

Смежные вопросы