2015-03-01 3 views
1

У меня есть строка = A + B + CC-D0. Я хочу использовать регулярное выражение, чтобы разделить его на части, чтобы получить массив из оператора {+, +, -}Regex для разделения строки на операторы

я попытался регулярное выражение:

"[^+-]" 

Но выход дал мне массив {, +, +,, +}, почему?

String s1 = "A+B+C-D"; 
    String s2 = "A0+B0"; 
    String[] op1 = s1.split([^+-]); 
    String[] op2 = s2.split([^+-]); 
    for(int i = 0; op1.length; i++){ 
     System.out.println(op1[i]); 
    } 

Вот результат:

Output of op1: 
"" 
"+" 
"+" 
"" 
"-" 

Output of op2: 
"" 
"" 
"+" 
+0

просто удалить пустые элементы из массива. –

+0

Да, я мог бы, но тогда мне нужны дополнительные вычисления – Eagle

+1

Вместо того, чтобы расщепляться, вы можете начать поиск. – HamZa

ответ

2

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

String s1 = "A+B+C-D"; 
String[] op1 = s1.replaceAll("[^+-]","").split("(?<=.)(?=.)"); 
for(String i: op1){ 
    System.out.println(i); 
} 

Выход:

+ 
+ 
- 
  • (?<=.) положительным, который утверждает просмотра назад, что матч должен предшествовать символ.

  • (?=.) Положительный взгляд, который утверждает, что за спиной должен следовать символ.

+0

Это работает хорошо :) – Eagle

+0

Возможно, вам стоит объяснить, что именно: split ("(? <=.) (? =.)") 'Делает точно. Это довольно загадочно. Все еще +1, потому что это работает очень хорошо. –

2

Проблема заключается в том, что вы разделив на одного персонажа, который не + или -. Когда вы разделите строку - ABC, она будет делиться 3 раза - на A, B и C соответственно, и, следовательно, вы получите массив - ["", "", "", ""].

Чтобы избежать этой проблемы, используйте квантор на регулярное выражение:

String s1 = "A+B+C-D"; 
String s2 = "A0+B0"; 
String[] op1 = s1.split("[^+-]+"); 
String[] op2 = s2.split("[^+-]+"); 
System.out.println(Arrays.toString(op1)); 
System.out.println(Arrays.toString(op2)); 

это расщепление на "[^+-]+".

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

String[] op1 = s1.replaceFirst("[^+-]+", "").split("[^+-]+"); 
System.out.println(Arrays.toString(op1)); // [+, +, -] 
+1

Я не думаю, что это исправлено на Java 8. Я просто попробовал. Может быть, я что-то упустил. –

+0

это также дает мне лишний пустой элемент. –

+0

@ peter.petrov Позвольте мне попробовать. Возможно, я сделал неправильное обновление. –

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