регулярное выражение Java - поиск пустого контента между двумя вхождениями поискового символа - PullRequest
0 голосов
/ 24 сентября 2010

Я новичок в Java Regex.

Извините за длинное сообщение.

У меня есть три требования:

1a) У меня есть строка, которая содержит три вхождения слова «ТЕСТ». За каждым этим словом следует ^, и мне нужно проверить, является ли содержимое между 2 и 3 вхождением ^ пустым, если оно пустое / пустое, продолжите поиск, чтобы увидеть, является ли содержимое между 5 и 6 вхождением ^ «» Если это "", то замените его на пустое / пустое Пример: Существующая строка:

aaaa^ 
TEST^x^^y^z^""^cccc^bbb^ 

Ожидаемая строка:

aaaa^ 
TEST^x^^y^z^^cccc^bbb^ 

1b) Если содержимое между 2-м и 3-м вхождением ^ не пустое и не "", то не изменяйте содержимое между 5-м и 6-м вхождениями

Существующая строка:

TEST^p^^q^r^""^lll^mmm^ 

Ожидаемая строка:

TEST^p^^q^r^""^lll^mmm^

Мне нужно повторять эту логическую проверку всякий раз, когда найдено слово TEST.

1c) Если содержимое между 5-м и 6-м вхождением ^ не пустое и не "", а если содержимое между 2-м и 3-м пустым / пустым, замените его на STR.

Существующая строка:

TEST^g^^q^r^YYY^lll^mmm^ 

Ожидаемая строка:

TEST^g^STR^q^r^YYY^lll^mmm^ 

Мне нужно выполнить все вышеперечисленные случаи в регулярном выражении Java. Я мог бы заставить дело 1 работать на основе ценного вклада из моей предыдущей публикации на этом форуме. Я не мог заставить дело 2 и 3 работать.

Как выполнить случаи 2 и 3 в одном и том же выражении регулярного выражения (я не уверен, каковы выражения регулярного выражения для проверки не пустой контнет и проверки 'ИЛИ'). В мире без регулярных выражений, если говорить просто, я могу позаботиться о 3 случаях следующим образом:

if (the content between 2nd and 3rd occurence of ^ is empty) 
{ 

if(content between 5th and 6th occurence of ^ is "") 
{ 
make this content empty 
} 
else 
{ 
set the content between 2nd and 3rd occurence of ^ as STR 
} 


} 

Но так как мне нужно сделать эту проверку для каждой строки, которая начинается со слова TEST в строке, я склоняюсь к регулярному выражению.

До сих пор регулярное выражение, которое работает для случая 1, выглядит следующим образом:

str.replaceAll("(TEST\\^[^^]*\\^\\^[^^]*\\^[^^]*\\^)\"\"", "$1") 

Для 2-го случая я попытался изменить приведенное выше регулярное выражение следующим образом, но безуспешно (Пытался найти не пустое ЗНАЧЕНИЕ МЕЖДУ 2-Й И 3-Й ПОЛУЧЕНИЕМ, где i asSumed *\\d0$ представляет ПУСТОЙ, а [\\d0$] означает ПУСТОЙ):

str.replaceAll("(TEST\\^[^^]*\\^[^\\d0$]\\^[^^]*\\^[^^]*\\^)\"\"", "$1") 

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

Любая помощь очень ценится.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 27 сентября 2010

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

var arr;
arr=str.split("\^","g");

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

Извините, если мой синтаксис Java неверен!

1 голос
/ 24 сентября 2010

Мне кажется, что ^ - это разделитель.Так что это может сделать жизнь намного проще, если вы просто разделите строку на разделитель и будете работать с массивом:

List<String> lines = FileUtils(myFile, myEncoding);
List<String[]> allValues = new ArrayList<String[]>();
for (String line: lines)
    allValues.add(line.split("\\^"));

В приведенном выше примере показан метод обработки всего файла CSV с использованием apache-commons-io.

0 голосов
/ 25 сентября 2010

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

public class Main {

    public static void main(String[] args) {
        System.out.println(replace("TEST^x^^y^z^\"\"^cccc^bbb^", '^'));//case 1a
        System.out.println(replace("TEST^x^^y^z^\"\"Something^cccc^bbb^", '^'));//case 1a
        System.out.println(replace("TEST^x^^y^z^Something\"\"^cccc^bbb^", '^'));//case 1a
        System.out.println(replace("TEST^x^Something^y^z^\"\"^cccc^bbb^", '^'));//case 1b
        System.out.println(replace("TEST^x^^y^z^\"Something\"^cccc^bbb^", '^'));//case 1c

        System.out.println(replace("TEST|x||y|z|\"\"|cccc|bbb|", '|'));//case 1a
        System.out.println(replace("TEST|x||y|z|\"\"Something|cccc|bbb|", '|'));//case 1a
        System.out.println(replace("TEST|x||y|z|Something\"\"|cccc|bbb|", '|'));//case 1a
        System.out.println(replace("TEST|x|Something|y|z|\"\"|cccc|bbb|", '|'));//case 1b
        System.out.println(replace("TEST|x||y|z|\"Something\"|cccc|bbb|", '|'));//case 1c
    }

    /*
    private static String replace(String in) {
        String intermediateResult = in.replaceAll("(TEST\\^[^^]*\\^\\^[^^]*\\^[^^]*\\^)\"\"\\^", "$1^");
        String finalResult = intermediateResult.replaceAll(
                "(TEST\\^[^^]*\\^)(\\^[^^]*\\^[^^]*\\^([^\"\\^].*|\"[^\"].*))", "$1STR$2");
        return finalResult;
    }*/

    private static String replace(String in, char deliminator) {
        String delim = "\\"+deliminator;
        String intermediateResult = in.replaceAll(
                "(TEST" + delim +
                "[^" + delim + "]*" +
                delim + delim +
                "[^" + delim + "]*" + delim +
                "[^" + delim + "]*" + delim +
                ")\"\"" + delim,
                "$1"+deliminator);

        String finalResult = intermediateResult.replaceAll(
                "(TEST" + delim +
                "[^" + delim + "]*" 
                + delim + ")(" + delim +
                "[^" + delim + "]*" + delim +
                "[^" + delim + "]*" + delim +
                "([^\"" + delim + "].*|\"[^\"].*))", "$1STR$2");
        return finalResult;
    }
}

вывод

TEST^x^^y^z^^cccc^bbb^
TEST^x^^y^z^""Something^cccc^bbb^
TEST^x^STR^y^z^Something""^cccc^bbb^
TEST^x^Something^y^z^""^cccc^bbb^
TEST^x^STR^y^z^"Something"^cccc^bbb^
TEST|x||y|z||cccc|bbb|
TEST|x||y|z|""Something|cccc|bbb|
TEST|x|STR|y|z|Something""|cccc|bbb|
TEST|x|Something|y|z|""|cccc|bbb|
TEST|x|STR|y|z|"Something"|cccc|bbb|
0 голосов
/ 24 сентября 2010

Сначала я попытаюсь решить вашу (1b) проблему. Извините, но я думаю, что вы забыли упомянуть, какое действие следует предпринять в (1b), если содержимое между 2 и 3 вхождением ^ IS BLANK.

1b) Если содержимое между 2-м и 3-м вхождением ^ не является пустым и не "", то не изменяйте содержимое между 5 и 6 встречами

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