字符串正则表达式无法拆分右括号中的单词
String regex is not working to split words in closed parenthesis
我正在使用字符串正则表达式来拆分以下字符串
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)";
我的字符串分词器 class 如下
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);
}
}
当我将字符串传递给上面的 class
时,我得到如下输出
我想拆分括号 ( Time.currenttime BETWEEN 800 AND 2000 ) and ( Campaign.period BETWEEN 2400 AND 600 )
中的字符串,如下所示
我尝试了不同的方法 none 它起作用了 你能建议我需要对我的正则表达式进行哪些更改才能使其起作用吗
我建议您完整捕获引用的字符串。
您需要转义 .
您可以使用以下正则表达式,但请注意它会自动跳过任何它无法识别的内容:
[()]|"[^"]*"|\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
)
我正在使用字符串正则表达式来拆分以下字符串
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)";
我的字符串分词器 class 如下
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);
}
}
当我将字符串传递给上面的 class
时,我得到如下输出我想拆分括号 ( Time.currenttime BETWEEN 800 AND 2000 ) and ( Campaign.period BETWEEN 2400 AND 600 )
中的字符串,如下所示
我尝试了不同的方法 none 它起作用了 你能建议我需要对我的正则表达式进行哪些更改才能使其起作用吗
我建议您完整捕获引用的字符串。
您需要转义 .
您可以使用以下正则表达式,但请注意它会自动跳过任何它无法识别的内容:
[()]|"[^"]*"|\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
)