Java, регулярное выражение для разделения строки на разделитель с ограничениями - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть неправильно сформированная строка base64 в java.

Это не совсем неправильно сформировано, но строка иногда содержит больше данных в кодировке base64.

Я хочу разбить строку и думаю, regex - лучший способ достичь этого.

Существуют случаи:

  • , если в строке только одна base64, либо
    • не содержит никаких символ заполнения =
    • содержит символы заполнения (один или два) только в конце
  • , если есть больше base64 в строка, она будет
    • содержать символы для заполнения (один или два) не в конце (или не только в конце)

Теперь я хочу получить String[], который содержит одиночные строки base64.

Таким образом, регулярное выражение не должно разделяться, если нет символа padding или символ padding находится в конце. Но он должен разделиться, если в середине есть заполнитель (и может быть один или два символа).

Тестовый фрагмент:

import java.util.Base64;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/*
TEST CASES:
output array shall contain one item only
TG9y
TG9yZW0=
TG9yZQ==

output array shall contain two items
TG9yZW0=TG9y
TG9yZW0=TG9yZW0=
TG9yZW0=TG9yZQ==

TG9yZQ==TG9y
TG9yZQ==TG9yZW0=
TG9yZQ==TG9yZQ==

output array shall contain three items
TG9yZW0=TG9yZW0=TG9y
TG9yZQ==TG9yZW0=TG9y
...
*/

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

    String buffer = "";

    try {
      byte[] decodedString = Base64.getDecoder().decode(buffer.getBytes("UTF-8"));
      System.out.println(new String(decodedString));
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
      System.err.println("Buffer: " + buffer);
    } catch (UnsupportedEncodingException e) { }
  }
}

Я не уверен, что регулярное выражение полностью способен на это, или если это лучший способ сделать это.

1 Ответ

1 голос
/ 03 апреля 2020

Как указано в комментарии , вы можете разбить строку после знака = , равного , за которым не следует = , равный знак, используя комбинацию (?<=X) положительный взгляд нулевой ширины и (?!X) отрицательный взгляд нулевой ширины :

String[] arr = input.split("(?<==)(?!=)");

Тест

String[] inputs = {
        "TG9y",
        "TG9yZW0=",
        "TG9yZQ==",
        "TG9yZW0=TG9y",
        "TG9yZW0=TG9yZW0=",
        "TG9yZW0=TG9yZQ==",
        "TG9yZQ==TG9y",
        "TG9yZQ==TG9yZW0=",
        "TG9yZQ==TG9yZQ==",
        "TG9yZW0=TG9yZW0=TG9y",
        "TG9yZQ==TG9yZW0=TG9y",
        "TG9yTG9yZQ==TG9yZW0=" };
Decoder decoder = Base64.getDecoder();
for (String input : inputs) {
    String[] arr = input.split("(?<==)(?!=)");
    for (int i = 0; i < arr.length; i++)
        arr[i] = new String(decoder.decode(arr[i]), StandardCharsets.US_ASCII);
    System.out.println(Arrays.toString(arr));
}

Выход

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