Строковое регулярное выражение не работает для разделения слов в закрытой скобке - PullRequest
0 голосов
/ 24 апреля 2020

Я работаю с регулярным выражением строки, чтобы разбить строку ниже

String input = "( Customer.browse == \"Car Loan\" ) AND ( Campaign.period BETWEEN 2400 AND 600 ) "
            + "AND ( Customer.eligibity == TRUE ) AND ( Campaign.campaign_name == \"Browse To Start\") "
            + "AND ( Customer.application_started == \"Car Loan\" ) AND ( Time.currenttime BETWEEN 800 AND 2000 ) "
            + "THEN ( Notification.message == SUPPRESS)";

Мой класс токенайзера строки такой, как показано ниже

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

    public class StringRegexClass {

        public ArrayList<String> stringTokenizer(String str) {

            ArrayList<String> tokenList = new ArrayList<String>();
            Pattern pattern = Pattern.compile("[(\")]|\\w+.\\w+.\\w+|\\w+.\\w+|==");
            Matcher matcher = pattern.matcher(str);
            while (matcher.find()) {
                tokenList.add(matcher.group());
            }
            return (tokenList);
        }
    }

И я получаю вывод, как показано ниже, когда я передаю строка к вышеуказанному классу

enter image description here

Я хочу разбить строки в скобках ( Time.currenttime BETWEEN 800 AND 2000 ) and ( Campaign.period BETWEEN 2400 AND 600 ), как показано ниже

enter image description here

Я пробовал разные способы, но ни один из них не работал. Подскажите, пожалуйста, какие изменения мне нужно внести в мое выражение регулярного выражения, чтобы оно заработало

1 Ответ

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

Я бы порекомендовал вам захватить строку в кавычках полностью.

Вам нужно экранировать .

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

[()]|"[^"]*"|\w+(?:\.\w+)?|==

В Java 4 +:

public static List<String> stringTokenizer2(String str) {
    List<String> tokenList = new ArrayList<>();
    Pattern pattern = Pattern.compile("[()]|\"[^\"]*\"|\\w+(?:\\.\\w+)?|==");
    for (Matcher matcher = pattern.matcher(str); matcher.find(); )
        tokenList.add(matcher.group());
    return tokenList;
}

В Java 9 +:

public static List<String> stringTokenizer(String str) {
    return Pattern.compile("[()]|\"[^\"]*\"|\\w+(?:\\.\\w+)?|==").matcher(str)
            .results().map(MatchResult::group).collect(Collectors.toList());
}

Тест (Java 8)

String input = "( Customer.browse == \"Car Loan\" ) AND ( Campaign.period BETWEEN 2400 AND 600 ) AND ( Customer.eligibity == TRUE ) AND ( Campaign.campaign_name == \"Browse To Start\") AND ( Customer.application_started == \"Car Loan\" ) AND ( Time.currenttime BETWEEN 800 AND 2000 ) THEN ( Notification.message == SUPPRESS)";
for (String token : stringTokenizer(input))
    System.out.println(token);

Выход

(
Customer.browse
==
"Car Loan"
)
AND
(
Campaign.period
BETWEEN
2400
AND
600
)
AND
(
Customer.eligibity
==
TRUE
)
AND
(
Campaign.campaign_name
==
"Browse To Start"
)
AND
(
Customer.application_started
==
"Car Loan"
)
AND
(
Time.currenttime
BETWEEN
800
AND
2000
)
THEN
(
Notification.message
==
SUPPRESS
)
...