我有一个动态生成的字符串。
我需要根据关系运算符分割字符串。
为此,我可以使用split函数。
现在我也想知道,从上述正则表达式中,实际上是根据哪个关系运算符对字符串进行了分割。
一个例子, 输入时
String sb = "FEES > 200";
申请
List<String> ls = sb.split(">|>=|<|<=|<>|=");
System.out.println("Splitted Strings: "+s);
会给我结果,
Splitted strings: [FEES , 200 ]
但预期结果:
Splitted strings: [FEES , 200 ]
Splitted Relational Operator: >
答案 0 :(得分:11)
您可以将3个捕获组与第二组交替使用:
(.*?)(>=|<=|<>|>|<)(.*)
说明
(.*?)
将任意字符匹配零次或多次非贪婪(>=|<=|<>|>|<)
匹配>=
或<=
或<>
或>
或<
(.*)
匹配任意字符零次或多次例如:
String regex = "(.*?)(>=|<=|<>|>|<)(.*)";
String string = "FEES >= 200";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
if(matcher.find()) {
System.out.println("Splitted Relational Operator: " + matcher.group(2));
System.out.println("Group 1: " + matcher.group(1) + " group 3: " + matcher.group(3));
}
答案 1 :(得分:3)
我建议使用正则表达式,这种情况在您的情况下更为灵活。
String sb = "FEES > 200";
Pattern pat = Pattern.compile("(.*?)(>=|<=|<>|=|>|<)(.*)");
Matcher mat = pat.matcher(sb);
if (mat.find()) {
System.out.println("Groups: " + mat.group(1) + ", " + mat.group(3));
System.out.println("Operator: " + mat.group(2));
}
答案 2 :(得分:1)
使用Pattern
执行此操作。
String sb = "FEES > 200";
Pattern pattern = Pattern.compile("(.*)(>|>=|<|<=|<>|=)(.*)");
Matcher matcher = pattern.matcher(sb);
if (matcher.find()) {
System.out.println("Grouped params: " + matcher.group(1) + "," + matcher.group(3));
System.out.println("Split operator: " + matcher.group(2));
}
请注意:
matcher.group(0)
->所有字符串matcher.group(1)
->匹配的第一部分matcher.group(2)
->拆分运算符matcher.group(3)
->匹配的第二部分答案 3 :(得分:0)
您可以使用Pattern matcher
来匹配距离。下面显示的示例-
public static int indexOf(Pattern pattern, String s) {
Matcher matcher = pattern.matcher(s);
return matcher.find() ? matcher.start() : -1;
}
public static void main(String[] args) {
String sb = "FEES > 200";
String[] s = sb.split(">|>=|<|<=|<>|=");
System.out.println("Splitted Strings: "+ s);
int index = indexOf(Pattern.compile(">|>=|<|<=|<>|="), sb);
System.out.println("del "+ sb.charAt(index));
}
答案 4 :(得分:0)