2016-01-08 2 views
0

Soo я думаю, что я уже решил это, что я сделал:Регулярные выражения (знаменатель дроби)

String pattern = "(<=|>=)\\s{0,2}((+]\\s{0,2})?(\\d+\\s{0,2}[/]\\s{0,2}(\\d{2,}|[1-9])\\s{0,2}|\\d+[.]\\d{1,2}|\\d+))\\s{0,2}"; 

Узор что-то неправильно, я исправил его выше, и теперь он работает :)

У меня есть неравенство, которое может содержать> = или < =, некоторые пробелы и число. Это число может быть целым числом, десятичным числом с двумя десятичными знаками или долей, и я хочу получить номер на втором члене неравенства с помощью «Матчи». Пример:

4x1 + 6x2 <= 40/3 

Я попытался построить такой шаблон, и я смог его найти. Но потом я вспомнил, что фракцию нельзя делить на ноль, поэтому я хочу проверить это. Для этого я использовал следующий код:

String inequation = "4x1 + 6x2 <= 40/3"; 
String pattern = "(<=|>=)\\s{0,2}((+]\\s{0,2})?(\\d+\\s{0,2}[/]\\s{0,2}(\\d{2,}|[1-9])\\s{0,2}\\d+|\\d+[.]\\d{1,2}|\\d+))\\s{0,2}"; 
Pattern ptrn = Pattern.compile(pattern); 
Matcher match = ptrn.matcher(inequation); 
if(match.find()){ 
String fraction = match.group(2); 
System.out.println(fraction); 
} else { 
System.out.println("NO MATCH"); 
} 

Но он не работает должным образом. Если на знаменателе есть как минимум 2 цифры, он возвращается правильно (например, 40/32). Но если он имеет только 1 цифру, он возвращает только целую часть (например, 40).

В любом случае, чтобы решить эту проблему? Какое выражение следует использовать?

+0

Можете ли вы показать нам свой выход? –

+0

В примере я дал результат 40. Как я сказал, если у меня на втором члене такая фракция, как эта «40/32», она возвращается правильно (возвращается 40/32), но если доля на втором члене равна что-то вроде этого «40/3», выход идет только с числителем (40). – user5756984

ответ

0

Чтобы создать регулярные выражения, вы можете использовать debuggex. Он показывает вам хорошую диаграмму вашего выражения, и вы также можете проверить свои входы.

реализация Java (подтверждает, что числитель отличен от нуля.):

Matcher m = Pattern.compile("[<>]=?\\s{0,2}([0-9]*(/[1-9][0-9]*)?)$").matcher("4x1 + 6x2 <= 40/3"); 
    if (m.find()) { 
     System.out.println(m.group(1)); 
    } 

Вам нужно «$» в конце вашего выражения, так что он пытается сопоставить все неравенство.

+0

Im using Java :(Не показывает там вариант для Java – user5756984

+0

Вы можете использовать javascript. Это в основном то же самое. –

0

Вам нужно только число после знака неравенства? Затем выполните:

Matcher m = Pattern.compile("[<>]=?\\s*(.+?)\\s*$").matcher(string); 
String number = m.find() ? m.group(1) : null; 
Смежные вопросы