【问题标题】:String regex is not working to split words in closed parenthesis字符串正则表达式无法拆分右括号中的单词
【发布时间】:2020-04-24 07:31:03
【问题描述】:

我正在使用字符串正则表达式来拆分以下字符串

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

当我将字符串传递给上面的类时,我得到如下输出

我想将括号( Time.currenttime BETWEEN 800 AND 2000 ) and ( Campaign.period BETWEEN 2400 AND 600 )中的字符串拆分如下

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

【问题讨论】:

  • . 在正则表达式中具有特殊含义,因此您需要对其进行转义。我希望你只是忘了这样做,因为如果你不知道这个核心,非常基础,是 regex 的一部分,那么你需要多学习 regex。
  • @Andreas 我也试过了,但没用我是正则表达式的新手,我现在正在学习和做

标签: java regex string split tokenize


【解决方案1】:

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

你需要转义.

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

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

【讨论】:

  • Andreas - 在问题中,"Car Loan" 之前和之后的 " 被捕获为单独的组。
  • @ArvindKumarAvinash 是的。所以?你读过我回答的第一行吗?
  • 是的,你提到过,I would recommend you capture the quoted string in full.。是否可以单独捕获报价?我曾尝试这样做,但到目前为止都失败了。我来自stackoverflow.com/a/61382312/10819573
  • @ArvindKumarAvinash 由于 OP 是正则表达式的新手,我们现在应该保持简单,这就是为什么我建议进行更改以保持简单。是的,它可以做到,但我们需要高级正则表达式功能,如 零宽度正向回看零宽度正向预读,而 OP 似乎还没有准备好那些高级功能还没有。
  • @Rahul 要匹配其他比较运算符,请在末尾添加 |!=|&lt;=?|&gt;=?
猜你喜欢
  • 2017-03-07
  • 1970-01-01
  • 2011-10-06
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多