2015-02-17 3 views
1

Im пытается заполнить ArrayList словами, но иногда он добавляет пустой символ, почему? Как я могу избежать этого?Разбиение строк с регулярным выражением. Java

ArrayList<String> textAL = new ArrayList<String>(); 
    String text = "This.IS(a) text example blah? bl:ah"; 
    String regex = "[\\s\\?\\.,:;\\)\\(]"; 

    String[] splittedText = text.split(regex); 

    for(int i = 0; i < splittedText.length; i++){ 
     if(splittedText[i] != " "){ //ignore whitespace 
      textAL.add(splittedText[i]); 
     }   
    } 

    for(int i = 0; i < textAL.size(); i++){ 
     System.out.println("t2(" + i + ") "+ textAL.get(i)); 
    } 

Результат:

textAL(0) This 
textAL(1) IS 
textAL(2) a 
textAL(3) 
textAL(4) text 
textAL(5) example 
textAL(6) blah 
textAL(7) 
textAL(8) bl 
textAL(9) 
textAL(10) ah 
+0

'' [\\ s \\? \\.,:; \\) \\ (] + "'? или '" \\ W + "'? –

+0

Держу пари, что метод split вводит emptyStrings, где два разделителя смежны друг с другом (а также если они совпадают в начале и в конце) – Martin

ответ

2

Вы должны добавить квантора к вашему Pattern:

String text = "This.IS(a) text example blah? bl:ah"; 
// Edit: now with removed escapes when not necessary - thanks hwnd 
//    ┌ original character class 
//    |   ┌ greedy quantifier: "one or more times" 
//    |   | 
String regex = "[\\s?.:;)(]+"; 
String[] splittedText = text.split(regex); 
System.out.println(Arrays.toString(splittedText)); 

Выход

[This, IS, a, text, example, blah, bl, ah] 
+0

Хорошее объяснение. один плюс –

+0

@HovercraftFullOfEels спасибо! Получаю ли я черный или белый? : D – Mena

+0

Понял! Спасибо, сэр :) – Frank

1

Я думаю, что проблема в том, что вы забываете о + в конце вашего регулярного выражения, например,

String regex = "[\\s\\?\\.,:;\\)\\(]+" 

но как о чем-то, как простой как

String regex = "\\W+"; 

Обратите внимание, что \\W такое же, как ^\\w

Тест:

public static void main(String[] args) { 
    ArrayList 
    <String> textAL = new ArrayList<String>(); 
    String text = "This.IS(a) text example blah? bl:ah"; 
    // String regex = "[\\s\\?\\.,:;\\)\\(]+"; 
    String regex = "\\W+"; 

    String[] splittedText = text.split(regex); 

    for(int i = 0; i < splittedText.length; i++){ 
     textAL.add(splittedText[i]); 
    } 

    for(int i = 0; i < textAL.size(); i++){ 
     System.out.println("t2(" + i + ") "+ textAL.get(i)); 
    } 
} 

Результат:

t2(0) This 
t2(1) IS 
t2(2) a 
t2(3) text 
t2(4) example 
t2(5) blah 
t2(6) bl 
t2(7) ah 

Edit

Ваш Интернет другой вопроса здесь:

splittedText[i] != " " 

Вы сравнение строк с помощью оператора !=, и вы никогда не хотите сравнить строки с использованием либо == или !=. Вместо этого используйте метод equals(...) или equalsIgnoreCase(...). Поймите, что == и != проверяет, не являются ли эти два объекта или нет, что вас не интересует. Методы, с другой стороны, проверяют, имеют ли две строки одни и те же символы в одном порядке, и это важно Вот.

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

+0

Вниз избирателя - прокомментируйте? Мой код работает, кстати. –

+0

Хорошо, спасибо за совет man – Frank

0

насчет String regex = "[^\\w]+";, сделано таким образом, так что вы можете добавить свои собственные символы, которые вы не» t хотите совпадение, скажем, как апостроф "[^\\w']+"

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