Заменить символы новой строки внутри строки, кроме символов внутри json - PullRequest
1 голос
/ 04 августа 2020

Я использую этот пост как ссылку на этот вопрос - Как с помощью регулярного выражения удалить пробелы и символы новой строки из текста, кроме случаев, когда они находятся в строке json?

У меня есть следующая строка в программе java:

"stuff\n blah\n--payload {'meh': 'kar\n'}"

Я ищу регулярное выражение для замены символов новой строки во всей строке, за исключением одного в строке JSON. Результат, которого я ожидаю, будет:

"stuff blah --payload {'meh': 'kar\n'}"

Регулярное выражение, указанное в этом сообщении, отлично работает в большинстве случаев, но также заменяет \n в строке JSON. Конечный результат, который я получаю:

"stuff blah --payload {'meh': 'kar'}"

Я экспериментировал со следующим набором регулярных выражений:

^("[^"]*(?:""[^"]*)*")(\n+)  // I expected this to be a combination of newline and newline not within double quotes

[\n\r]\s*  //Match new lines, and then could possibly negate it to be within double quotes?

Но я все еще не могу найти вариант использования, где символ новой строки в строке значения JSON не будет проигнорирован. Есть ли возможное решение?

Ответы [ 2 ]

0 голосов
/ 14 августа 2020

Это может помочь:

public static void main(String[] args) {
    String input = "stuff\n blah\n--payload {'meh': 'kar\n'}";
    // Wanted output: Output: "stuff blah --payload {'meh': 'kar\n'}"

    String regexPayload = "--payload\\s[^\\}]+\\}";
    Matcher matcherExtractPayload = Pattern.compile(regexPayload, Pattern.DOTALL).matcher(input);
    Matcher matcherReplaceWithTag = Pattern.compile(regexPayload).matcher(input);

    String tag = "#PAYLOAD#";
    String taggedPayload = "EMPTY";
    String payLoad = "NO_PAYLOAD_FOUND";
    if(matcherExtractPayload.find()) {
        payLoad = matcherExtractPayload.group();
        taggedPayload = matcherReplaceWithTag.replaceFirst(tag);
    }

    String removedNewline = Pattern.compile("\n").matcher(taggedPayload).replaceAll("");
    String restoredPayload = removedNewline.replaceFirst(tag, " " + payLoad);

    System.out.println(restoredPayload); // Output: "stuff blah --payload {'meh': 'kar\n'}"
}
0 голосов
/ 04 августа 2020

Я считаю, что вы слишком усложняете это двумя способами:

  1. Использование регулярного выражения для всего, что связано с JSON.
  2. Попытка решить для всей строки сразу.

JSON

Regex + JSON, например Regex + HTML TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚ N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ , просто не смешивайте.

Разбейте проблему

Если JSON всегда находится в конце и всегда ограничен известной строкой, вы можете:

  • Разделить строку по последнему разделителю (--payload в вашем примере).
  • Обработать первую строку (удалить символы новой строки).
  • Smu sh их снова вместе.
  • Прибыль.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...