Принятие только одного символа в строке в регулярном выражении - PullRequest
0 голосов
/ 05 апреля 2011

Я пытаюсь разбить строку, отформатированную как Bananas|,|Bananas|||Bananas|Oranges|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Green Apples|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Red Apples|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Pears, с помощью регулярного выражения в разделителях ||| или |,|.Я использую [a-zA-Z |]+\|[,|\0]\|, но у меня есть небольшая проблема: разделитель тройной трубы захватывается классом символов [a-zA-Z |].

Есть ли способ изменить класс символов [a-zA-Z |] только напринять один символ канала подряд, а разрешить любое количество других?(То есть он должен принимать accessories|batteries, но не accessories||batteries.)

Еще пример: из исходной строки регулярное выражение должно принимать Bananas|Oranges|,| или Bananas|||, а не Bananas|||Bananas|Oranges|,| с любым числомимен с разделителями из одной трубы перед |[,|]|.

Ответы [ 4 ]

1 голос
/ 05 апреля 2011

Я думаю, вы хотели бы группу, содержащую кучу этих [a-zA-Z ]+, за которыми всегда следует \|. Группа может повторяться много раз и всегда заканчивается на ,| или || (после трейлинга |), поэтому (,|\|)\|

Всего: ([a-zA-Z ]+\|)+(,|\|)\|

0 голосов
/ 05 апреля 2011

Я что-то упускаю, но почему вы не можете сделать прямое деление, используя регулярное выражение == \|\|\||\|,\|?Вот проверенный скрипт, который работает для меня:

import java.util.regex.*;
public class TEST {
    public static void main(String[] args) {
        String subjectString = "Bananas|,|Bananas|||Bananas|Ora" +
        "nges|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Gre" +
        "en Apples|,|Bananas|||Bananas|Oranges|||Bananas|Orange" +
        "s|Red Apples|,|Bananas|||Bananas|Oranges|||Bananas|Ora" +
        "nges|Pears";
        String[] splitArray = null;
        Pattern regex = Pattern.compile("\\|\\|\\||\\|,\\|");
        splitArray = regex.split(subjectString);
        int i;
        for (i = 0; i < splitArray.length; ++i) {
            System.out.println(splitArray[i]);
        }
    }
}

Вот вывод:

Bananas
Bananas
Bananas|Oranges
Bananas
Bananas|Oranges
Bananas|Oranges|Green Apples
Bananas
Bananas|Oranges
Bananas|Oranges|Red Apples
Bananas
Bananas|Oranges
Bananas|Oranges|Pears

0 голосов
/ 05 апреля 2011

Почему бы не использовать не жадный квантификатор в вашем регулярном выражении? Таким образом, он остановится на первых ||| или |,|, которые он найдет.

0 голосов
/ 05 апреля 2011

Поскольку вы сказали, что используете Java, альтернативным подходом будет вычисление:

s.replaceAll("|||", "|,|").split("|,|");

где s - ваша начальная строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...