2017-01-04 2 views
1

Я написал программу для разбиения строки на |o| и |e| знаков.Как сопоставить строки, разделенные символом «| e |» знак

Это вся моя строка (которую я хочу обработать):

code|e|0.07610 |o| p|e|0.02225 |o| li|e|0.02032 |o| applet|e|0.01305 |o| pre|e|0.01289 

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

String [] trs = tgs[1].split("[^ |o| ]"); //tgs[1] have the whole string 
for (int i=0 ; i<9; i++) { 
    String t = trs[i].split("[^|e|]")[0]; 
    e.add(new ProbTranslate(t, Double.parseDouble(trs[i].split("[^|e|]")[1]))); 
} 

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

Любая помощь будет оценена по достоинству. Благодарю.

+3

'.split («\\ | [ае] \\ |»)' – Tushar

+0

* Я чувствую, что моя ошибка в неправильном регулярных выражений часть * - это право, шаблоны являются неправильными как инвертированный символьный класс по-прежнему соответствует только один символ, отличный от тех, которые определены в классе char. –

+0

кажется, что это правильное регулярное выражение, но обратите внимание, что i пробегает вокруг '| o |', как я могу вставить эти пробелы для сопоставления? @Tushar –

ответ

2

Цитирую специальные символы в регулярных выражениях, Java предоставляет метод: java.util.regex.Pattern#quote

Применяя к вашему примеру выше, это может, например, привести к

import java.util.regex.Pattern; 

public class Main { 

    public static void main(String[] args) { 
     final String[] split1 = "code|e|0.07610 |o| p|e|0.02225 |o| li|e|0.02032 |o| applet|e|0.01305 |o| pre|e|0.01289".split(Pattern.quote(" |o| ")); 

     for (int i = 0; i < split1.length; ++i) { 
      final String name = split1[i]; 
      final String[] split2 = name.split(Pattern.quote("|e|")); 

      for (int j = 0; j < split2.length; ++j) { 
       System.out.println(split2[j]); 
      } 

      System.out.println(""); 
     } 
    } 
} 

Выходные:

code 
0.07610 

p 
0.02225 

li 
0.02032 

applet 
0.01305 

pre 
0.01289 
+0

Спасибо. Другое решение :) Я продолжаю использовать этот зол. –

0

Решение

внести два изменения:

  1. "[^ |o| ]""(\\|o\\|)"
  2. "[^|e|]""(\\|e\\|)"

С учетом этих изменений, ваш код будет выглядеть следующим образом:

String [] trs = tgs[1].split("(\\|o\\|)"); 
for (int i=0 ; i<9; i++) { 
    String t = trs[i].split("(\\|e\\|)")[0]; 
    e.add(new ProbTranslate(t, Double.parseDouble(trs[i].split("(\\|e\\|)")[1]))); 
} 

Объяснение

Есть три проблемы с вашим регулярным выражением.

  1. String#split(String) расколы вокруг подпоследовательности, что матч данное регулярное выражение. Поэтому, если вы хотите разделить/удалить каждый |o|, то вашему регулярному выражению нужно будет соответствовать |o|. Однако кажется, что вы думаете (неправильно), что регулярное выражение должно соответствовать всем другим, чем разделенная подпоследовательность, так как вы используете отрицательный класс символов. Не делай этого.
  2. Чтобы соответствовать (или исключать, если на то пошло) полную подстроку в регулярном выражении, подстрока должна содержаться в круглых скобках, например. (substring). Скобки обозначают capture group. Если вы используете скобки (например, [characters]), то это character class, что эквивалентно произнесению «любого из этих отдельных символов», а не «этой полной подстроке».
  3. Символ | является управляющим символом в регулярном выражении. Это означает, что если вы хотите сопоставить литерал |, а не использовать его для обозначения regex alternation, вам необходимо его избежать.И так как это Java, вы должны также избежать \, чтобы Java не пыталась изменить \| на некоторый специальный символ Java до того, как строка даже попадет в механизм регулярных выражений. Следовательно, \\|.
Смежные вопросы