Как токенизировать строку с разделителем и без него в одном разбиении - PullRequest
0 голосов
/ 03 октября 2018

Предположим, у меня есть одно строковое содержимое, как показано ниже

Input:
  FTX+AAA+++201707141009UTC'
  FTX+BBB+++201707141009UTC'
  FTX+CCC+++201707141009UTC?:??'
  PISCO US LTS;?:V.D??'  
  SOUZA?:GB?:GB'
  FTX+ZZZ+++201707141009UTC'
Expected Output:
  Number of segments: 4

Input:
  FTX+AAA+++201707141009UTC'
  FTX+CCC+++201707141009UTC?:??'
  PISCO US LTS;?:V.D??'  
  FTX+ZZZ+++201707141009UTC'
Expected Output:
  Number of segments: 3

По сути, я хочу рассматривать как одну и ту же строку, когда разделитель 'идет с вопросительным знаком.Разделитель строк: '

Как токенизировать и получить количество сегментов в Java ???

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

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

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

public void test() {
    test("FTX+AAA+++201707141009UTC'" +
            "FTX+BBB+++201707141009UTC'" +
            "FTX+CCC+++201707141009UTC?:??'" +
            "PISCO US LTS;?:V.D??'" +
            "SOUZA?:GB?:GB'" +
            "FTX+ZZZ+++201707141009UTC'");
    test("FTX+AAA+++201707141009UTC'" +
            "FTX+CCC+++201707141009UTC?:??'" +
            "PISCO US LTS;?:V.D??'" +
            "FTX+ZZZ+++201707141009UTC'");
}

private void test(String s) {
    String[] split = s.split("(?<!\\?)'");
    System.out.println(split.length+"->"+Arrays.toString(split));
}

печатает

4 -> [FTX + AAA +++ 201707141009UTC, FTX + BBB +++ 201707141009UTC, FTX + CCC +++ 201707141009UTC?: ?? PISCO US LTS;?: VD?? 'SOUZA?: GB?: GB, FTX + ZZZ +++ 201707141009UTC]

2 -> [FTX + AAA +++ 201707141009UTC, FTX + CCC +++ 201707141009UTC?: ??' PISCOUS LTS;?: VD ?? 'FTX + ZZZ +++ 201707141009UTC]

0 голосов
/ 03 октября 2018

Я думаю, что он / она хочет это:

String a = "FTX+AAA+++201707141009UTC'"
        + "FTX+BBB+++201707141009UTC'"
        + "FTX+CCC+++201707141009UTC?:??'"
        + "PISCO US LTS;?:V.D??'  "
        + "SOUZA?:GB?:GB'"
        + "FTX+ZZZ+++201707141009UTC'";
String result[] = a.split("'");
List<String> stringList = new ArrayList<String>(Arrays.asList(result));
for (int i = 0; i < stringList.size(); i++) {
    if (!stringList.get(i).startsWith("FTX") && i != 0) {
        stringList.set(i-1, stringList.get(i-1) + stringList.get(i));
        stringList.remove(i);
        i--;
    }
}
for (int j = 0; j < stringList.size(); j++) {
    System.out.println(stringList.get(j));
}

FTX + AAA +++ 201707141009UTC
FTX + BBB +++ 201707141009UTC
FTX + CCC +++ 201707141009UTC?: ?? PISCO US LTS;?: VD ??SOUZA?: GB?: GB
FTX + ZZZ +++ 201707141009UTC

0 голосов
/ 03 октября 2018

Вы можете использовать отрицательное выражение в регулярном выражении:

String input = "FTX+AAA+++201707141009UTC'\n"
    + "  FTX+BBB+++201707141009UTC'\n"
    + "  FTX+CCC+++201707141009UTC?:??'\n"
    + "  PISCO US LTS;?:V.D??'  \n"
    + "  SOUZA?:GB?:GB'\n"
    + "  FTX+ZZZ+++201707141009UTC'";

String[] tokens = input.split("(?<!\\?)'\\s*");
System.out.println(tokens.length);

4

Но во втором примере я ожидал бы два сегмента, а не три...

...