Javaの、制約のある区切り文字の上に文字列を分割するための正規表現

ダニエル:

私はJavaで不正な形式のbase64文字列を持っています。

それは絶対に不正な形式が、文字列は時々よりbase64でエンコードされたデータが含まれていません。

私は、文字列を分割したい、と私は正規表現がこれを達成するための最良の方法だと思います。

ケースがあります。

  • 文字列に一つだけのbase64があれば、それはどちらか
    • 任意のパディング文字が含まれていません =
    • パディング文字(複数可)(一つまたは二つ)が含まのみ終わりに
  • より多くのbase64では、文字列である場合、それは意志
    • パディング文字(複数可)(一つまたは二つ)を含んでいない端部に(またはだけでなく端)

今、私が取得したいString[]単一base64で文字列を保持しているが。

正規表現は、分割する必要はありませんので、そこにはパディング文字ではありません、またはパディング文字が末尾にある場合。しかし、それはパディング文字が真ん中に存在する場合に分割することがある(と1つの鉱石2のパディング文字があることができます)。

テストスニペット:

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) { }
  }
}

正規表現は、この完全に可能である場合、私はわからない、またはこれを行うための最善の方法である場合。

アンドレアス:

以下のようにコメントで述べた、あなたは後に文字列を分割することができます= 等しいが続かない記号、= 同等の組み合わせ使用することにより、符号(?<=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]

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=396927&siteId=1