Java разделить выражение по символам, но не в шаблоне - PullRequest
0 голосов
/ 30 мая 2018

Эксперты по Regex, нужна помощь в разбивке:

((1+2 eq 3) and (2+5 eq 6) or currentyear('yyy') eq '2017')

на:

1, 2, eq, 3, and, 2, 5, eq, 6, or, currentyear('yyy'), eq, 2017

Я использую регулярное выражение:

"[() ]"

Проблема ввыражение функции currentyear('yyyy') также разбивается на скобки.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Это так же хорошо, как и получается:

import java.util.regex.Pattern;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "source string to match with pattern";
  Pattern re = Pattern.compile("\\s(?=\\w+\\(.*?\\))|(?:^|\\s)\\(+|\\)$|\\s|\\+|(?<=\\d)\\)",Pattern.MULTILINE);
  String[] parts = re.split(sourcestring);
    for(int partsIdx = 0; partsIdx < parts.length; partsIdx++ ){
      System.out.println( "[" + partsIdx + "] = " + parts[partsIdx]);
    }
  }
}

Вывод:

[0] = 
[1] = 1
[2] = 2
[3] = eq
[4] = 3
[5] = 
[6] = and
[7] = 2
[8] = 5
[9] = eq
[10] = 6
[11] = 
[12] = or
[13] = currentyear('yyy')
[14] = eq
[15] = '2017'

Необработанный шаблон разбиения:

\s(?=\w+\(.*?\))|(?:^|\s)\(+|\)$|\s|\+|(?<=\d)\)

Тем не менее, парсер выполняетлучшая работа.

0 голосов
/ 30 мая 2018

Не пуленепробиваемый, но это регулярное выражение должно работать:

"(?<!')[()](?!')|'\\)| '?$"

Используется отрицательный взгляд вперед / назад до , а не разделение, когда предшествует / следует ' / ',и добавляет разделение для конечного ') и пробелов, за которыми может следовать кавычка.

...