2016-12-13 16 views
0

Я разбираю строку, а затем мне нужно преобразовать ее в число. Но если он содержит деление на 0, напримерРегулярное выражение для деления на 0

String str1 = "1+2+3-5/0+4+6" 
String str2 = "1+2+3-4/0.000 +4+6" 

Я должен написать в этой строке «Деление на ошибку 0». Мое регулярное выражение выглядит так, но это неправильно.

String REGEXP_DIV_BY_0 = "(.*)([/0\\.0{1,4}](^[1-9]+))(.*)"; 

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

+1

Что делать, если кто-то пишет '2/(1-1)'? Как вы это обнаружите? – byxor

+7

как насчет 'x/(1 - 1)'? RegEx не выбор для этого, почему бы не оценить его и искать исключение? –

+0

В моей строке я уже вычислил это выражение, поэтому у меня есть только числа и операции без каких-либо областей, как я писал в моем примере –

ответ

0

Это должно сделать работу: .*\/0([^.]|$|\.(0{4,}.*|0{1,4}([^0-9]|$))).* Здесь вы можете поиграть с ним: https://regex101.com/r/lwAVan/1

+0

Это не будет соответствовать' 1/0'. –

+0

Спасибо, я отредактировал ответ так же, как и те случаи. –

+0

Спасибо за ваш ответ, это работает, но теперь правильно, например, для strinng «10/0.01 + 5» это правильно, но для «10/0.001 + 5» это неправильно –

0

это немного странно, но если вы действительно должны сделать это, то что-то вроде следующего рисунка должно работать:

0\.0{1,4}\D|/0[^\d.] 

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

1

Я хотел бы сделать:

/0+(?:\.?0*)?(?!\d) 

Объяснение:

/  : a slash (escape it if necessary) 
0+  : 1 or more 0 
(?:  : non capture group 
    \.?0* : an optional comma followed by 0 or more 0's 
)?  : end group (optional) 
(?!\d) : negative lookahead, assume there're no more digit followed the 0's 
+1

Это лучший ответ здесь, просто для объяснения. Regex выглядит как беспорядок для меня. – byxor

1

регулярное выражение не является правильным способом вычислить выражение, слишком много случаев, как 1/0, 1/(1-1), 1/(5+5-10), 1/(2*2-2^2)....

вы можете пойти с ScriptEngineManager:

String str1 = "555/0";  
    ScriptEngineManager mgr = new ScriptEngineManager(); 
    ScriptEngine engine = mgr.getEngineByName("js"); 
    try { 
     System.out.println(engine.eval(str1)); 
    } 
    catch (ScriptException e) { 
     e.printStackTrace(); 
    } 

Если есть /0 кейс, в результате получится «Infinity».

+0

Я использую этот диспетчер скриптов, но прежде чем я запустил метод eval, я хочу проверить с помощью регулярного выражения, если строка содержит деление на 0. Я проверяю все эти выражения в областях и вычисляет их раньше (не оценивайте по логике, есть такая задача :)) и у меня есть строка, которая содержит только числа и операции без областей, поэтому не будет таких ситуаций, как 1/(1-1), 1/(5 + 5-10), 1/(2 * 2 -2^2) –

+0

'sin() cos() sqrt() log() pow() PI ...' все это действительно так – Kent