Регулярное выражение в java не работает

Я конвертирую файл excel в CSV, а его в String.

Проблема в том, что регулярное выражение работает некорректно

Я хочу обнаружить такой текст:

Пакет MYW, Пакет MYW + Питание быстрого обслуживания, Пакет MYW + Питание, Пакет MYW + Питание Делюкс,

Номер + Билеты + Питание быстрого обслуживания

У меня есть массив строк. Поэтому мне нужно знать шаблон для этого, я пробую это, но он его не обнаруживает:

Pattern.compile("([A-Z]{3})+(\\s)+([A-Za-z]{3})+(\\s)+(\\+)");

Я пытаюсь сопоставить "MYW Pkg +", например, знаете, почему это не работает?

Больше кода:

chain — это массив со значениями типа «MYW Pkg»,

Pattern patPackageDescription = Pattern.compile("([A-Z]{3})+(\\s)+([A-Za-z])+(\\s)+(\\+)");
        for (int i = 0; i < chain.length; i++) {
            Matcher matPackageDescription = patPackageDescription
                    .matcher(chain[i]);

            if (matPackageDescription.matches()) {
                String space = String.format("%1$-" + 50 + "s",
                        chain[i].toString());
                a.append(space + "|\n");
            }
        }

С Уважением.


person arnoldssss    schedule 19.07.2016    source источник
comment
Какие части приведенной выше строки вы пытаетесь сопоставить. Я укажу на две вещи: 1) (?) странно / скорее всего не нужно и 2) вы ищете [A-Z]+ прямо перед \\+ (даже если между Pkg и + есть пробел).   -  person Sam    schedule 19.07.2016
comment
@Sam Я пытаюсь сопоставить хотя бы MYW Pkg +, а анубхава (?) не чувствительна к регистру?   -  person arnoldssss    schedule 19.07.2016
comment
Встроенный модификатор без учета регистра будет выглядеть как (?i:[A-Z]), но вы можете просто использовать [A-Za-z]   -  person Wiktor Stribiżew    schedule 19.07.2016
comment
Все еще не достиг никакого результата :( Я добавил регулярное выражение к вопросу   -  person arnoldssss    schedule 19.07.2016
comment
покажите нам немного больше вашего кода   -  person spirit    schedule 19.07.2016
comment
код был добавлен   -  person arnoldssss    schedule 19.07.2016
comment
Я бы рекомендовал использовать debuggex.com для отладки проблем с регулярными выражениями.   -  person Leonard Brünings    schedule 19.07.2016


Ответы (2)


Метод matches() пытается сопоставить всю строку с шаблоном, чтобы сопоставить часть строки, вам нужно использовать метод find().

String str = "MYW Pkg, MYW Pkg + Quick Service Dining, MYW Pkg + Dining, MYW Pkg + Deluxe Dining,";
Pattern patPackageDescription = Pattern.compile("([A-Za-z]{3}\\s)+\\+");
Matcher matPackageDescription = patPackageDescription.matcher(str);

while (matPackageDescription.find()) {
    System.out.println(matPackageDescription.group());
}

Выходы:

MYW Pkg +
MYW Pkg +
MYW Pkg +

Посмотрите здесь для объяснения.

person spirit    schedule 19.07.2016
comment
Правильно то, что вы говорите, я добавляю (.*) для правильного совпадения .. так что ([A-Za-z]{n}\\s)+(\\+)+([A-Za-z]{n }\\s)+(\\+)+(.*) Это должно служить для следующих случаев: MYW Pkg + Quick Service Dining , Room + Tickets + Quick Service Dining..... Верно? - person arnoldssss; 19.07.2016
comment
Как я могу поставить n для любого числа? - person arnoldssss; 19.07.2016
comment
@arnoldssss, скажи мне, что именно тебе нужно сделать =) Так что я могу тебе помочь. - person spirit; 19.07.2016
comment
Мне нужно обнаружить в моем массиве String такие вещи, как: Room + Tickets + Quick Service Dining, MYW Pkg + Quick Service Dining. Поэтому мне нужно знать... почему это регулярное выражение не работает ([A-Za-z]{1,}\\s)+(\\+)+([A-Za-z]{1,}\ \s)+(\\+)+(.*) - person arnoldssss; 19.07.2016
comment
о, теперь я вижу свою проблему .. есть различия в обеих строках ... я дам ваш ответ как хороший .. спасибо - person arnoldssss; 19.07.2016
comment
Всегда пожалуйста. Но я думаю, вы используете слишком сложные регулярные выражения =). Например, вам не так уж нужны скобки. - person spirit; 19.07.2016

Ваша проблема в том, что вы используете Matcher.matches(), для которого требуется полное совпадение, если вы можете либо использовать find() для частичного совпадения, либо добавить .* для соответствия чему-либо после строки поиска.

([A-Z]{3})+(\s)+([A-Za-z]{3})+(\s)+(\+).*

Визуализация регулярных выражений

Демонстрация отладки

person Leonard Brünings    schedule 19.07.2016
comment
круто добавляю.. так ([A-Za-z]{n}\\s)+(\\+)+([A-Za-z]{n}\\s)+(\\+) +(.*) Это должно служить для этих случаев: MYW Pkg + Питание быстрого обслуживания и номер + Билеты + Питание быстрого обслуживания, верно? - person arnoldssss; 19.07.2016
comment
если ваша строка будет начинаться с чего-то вроде числа, она потерпит неудачу. вам также нужно добавить .*? в начало вашего регулярного выражения - person spirit; 19.07.2016