java - 字符串正则表达式无法分割闭括号中的单词

标签 java regex string split tokenize

我正在使用字符串正则表达式来分割下面的字符串

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 ) 和( Campaign.period BETWEEN 2400 AND 600 ) 如下

enter image description here

我尝试了不同的方法,但都不起作用,您能否建议我需要对正则表达式进行哪些更改才能使其工作

最佳答案

我建议您完整捕获引用的字符串。

您需要转义

您可以使用以下正则表达式,但请注意,它会默默地跳过任何它无法识别的内容:

[()]|"[^"]*"|\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
)

关于java - 字符串正则表达式无法分割闭括号中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61403288/

相关文章:

java - 多个WAR文件运行时如何传递-D参数?

c# - 带点的括号,正则表达式

javascript - 文本替换 javascript jquery

string - 如何从 std::string::String 中删除换行符/换行符?

c++ - 从类方法返回 "const char*"作为 std::string&

java - ExecutorService 在 REST API 中使用

java - ESB 服务客户端创建

java - 我正在尝试在 android 中创建一个注册 Activity ,但我的控件无法进行验证

html - 从字符串中删除给定 (x)HTML 标记的正则表达式

php - MYSQL 正则表达式 负向先行替代方案