Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串正则表达式无法拆分闭括号中的单词_Java_Regex_String_Split_Tokenize - Fatal编程技术网

Java 字符串正则表达式无法拆分闭括号中的单词

Java 字符串正则表达式无法拆分闭括号中的单词,java,regex,string,split,tokenize,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 (

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

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);
        }
    }
import java.util.ArrayList;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类StringRegSS{
公共ArrayList stringTokenizer(字符串str){
ArrayList tokenList=新的ArrayList();
模式模式=模式。编译(“[(\”)\\w+。\\w+。\\w+。\\w+。\\w+。\\w+。\\w+)=”;
Matcher-Matcher=pattern.Matcher(str);
while(matcher.find()){
添加(matcher.group());
}
返回(令牌列表);
}
}
当我将字符串传递给上面的类时,得到如下输出

我想将括号
(Time.currenttime介于800和2000之间)和(Campaign.period介于2400和600之间)
中的字符串拆分如下

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


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

我建议您完整捕获带引号的字符串

您需要退出

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

[()]|“[^”]*“|\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;
}
输出

(
Customer.browse
==
“汽车贷款”
)
和
(
竞选期间
之间
2400
和
600
)
和
(
顾客满意度
==
符合事实的
)
和
(
活动。活动名称
==
“浏览以开始”
)
和
(
Customer.application\u已启动
==
“汽车贷款”
)
和
(
Time.currenttime
之间
800
和
2000
)
然后
(
通知消息
==
镇压
)

在正则表达式中有特殊的含义,因此需要对其进行转义。我希望你忘了这么做,因为如果你不知道正则表达式的核心,非常基本的一部分,那么你需要多学一点正则表达式。@Andreas我也试过了,但没有用我是正则表达式的新手我现在正在学习和做Andreas-在问题中,
汽车贷款前后“
已作为单独的组捕获。@ArvindKumarAvinash是。所以你读过我答案的第一行了吗?是的,你提到过,
我建议你完整地捕获带引号的字符串。
。是否可以单独捕获报价?我曾试图这样做,但迄今为止失败了。我来自@ArvindKumarAvinash,因为OP对regex来说是新的,我们现在应该保持简单,这就是为什么我建议进行更改,保持简单。是的,这是可以做到的,但我们需要高级正则表达式功能,如零宽度正前视和零宽度正前视,而OP似乎还没有准备好使用这些高级功能。@Rahul若要匹配其他比较运算符,请添加
|!=|=结束。
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);