Java - ошибка разбора строки или split () при использовании нескольких разделителей - PullRequest
0 голосов
/ 30 июля 2011

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

Я работаю над программой, которая работает над удалением разделителей, указанных пользователем. Моя программа работает, если разделитель только один символ (специальный или нет). Однако, если пользовательский ввод является строкой, он удаляет все символы разделителя из строки сообщения.

ех. String message = "ab \ nc [d] e {fMardk1g (h) i} j"; вывод будет: bcefghij но ожидаемый результат abcdefghij

Я новичок в использовании класса Pattern, поэтому не знаю, в чем проблема.

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

import java.util.regex.Pattern;

public class ParsingTest {
    public static void main(String[] args) {
        String[] delimiters = { "Mardk1", "\n", "[", "]", "{", "}", "(", ")" };  
        StringBuilder regexp = new StringBuilder("");  
        regexp.append("[");  
        for(String s : delimiters) {  
            regexp.append("[");  
            regexp.append(Pattern.quote(s));  
            regexp.append("]");  
        }  
        regexp.append("]");  

        String message = "ab\nc[d]e{fMardk1g(h)i}j";  
        StringBuilder result = new StringBuilder("");  
        String[] a = message.split(regexp.toString());  
        for(String string : a) {  
            result.append(string);
        }
        System.out.println(result);
        for(String str: a) System.out.print(str);
        System.out.println();
    }
}

1 Ответ

1 голос
/ 30 июля 2011

Вы используете неправильную конструкцию группировки. Вы создаете шаблон как [xyz], который будет соответствовать любому отдельному символу x, y или z. Вы хотите сопоставить любую из нескольких полных строк, поэтому вам нужна обычная группировка в стиле () и оператор чередования (|). Посмотрите документацию Pattern для более подробной информации.

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

for(String s : delimiters) {
    // We don't want to start with (|
    if (regexp.length() > 1)
    {
        regexp.append("|");
    }
    regexp.append(Pattern.quote(s));  
}  
...