Заменить подстроку в строке, кроме случаев, когда строка находится в кавычках - PullRequest
3 голосов
/ 21 июля 2011

Диалект Regex: Java
Проблема: если задана строка, заменить все вхождения подстроки внутри нее, кроме случаев, когда эти вхождения находятся внутри кавычек.

Пример 1:

string: "test substr 'test substr' substr"
substring: "substr"
replacement: "YYYY"
output: "test YYYY 'test substr' YYYY"

Example2:

string: "test sstr 'test sstr' sstr"
substring: "substr"
replacement: "YYYY"
output: "test sstr 'test sstr' sstr"

Example3:

string: "test 'test substr'"
substring: "substr"
replacement: "YYYY"
output: "test 'test substr'"

Пока это моя лучшая попытка:

Regex: ((?:[^']*'[^']+')*?[^']*?)substring
Replace: $1replacement

Проблема в том, что ей нужна подстрокавне кавычек после последней строки в кавычках, иначе это не сработает, поэтому Example3 не будет работать (вывод: "test 'test YYYY'").

Большое спасибо за вашу помощь.

1 Ответ

4 голосов
/ 21 июля 2011

Вот способ:

public class Main {
    public static void main(String [] args) {

        String[] tests = {
                "test substr 'test substr' substr",
                "test sstr 'test sstr' sstr",
                "test 'test substr'"
        };

        String regex = "substr(?=([^']*'[^']*')*[^']*$)";

        for(String t : tests) {
            System.out.println(t.replaceAll(regex, "YYYY"));
        }
    }
}

печать:

test YYYY 'test substr' YYYY
test sstr 'test sstr' sstr
test 'test substr'

Обратите внимание, что это не работает, если ' можно экранировать, например, \.

Краткое объяснение:

Следующее: ([^']*'[^']*')* будет соответствовать 0 или четному числу одинарных кавычек с не кавычками между ними, а [^']*$ соответствует любым не кавычкам и концу строки.

Итак, полное регулярное выражение substr(?=([^']*'[^']*')*[^']*$) соответствует любому "substr", у которого 0 или четное число одинарных кавычек, при просмотре до конца строки!

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

aaa 'substr' bbb 'ccc ddd' eee
           ^     ^       ^
           |     |       |
           i     ii     iii

потому что он «видит» перед ним четное число одинарных кавычек ( i и ii ). Вы должны заставить его взглянуть на всю строку справа от нее (вплоть до $)!

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