String filter = phoneNumber eq '763436' and carrier eq 'AT and T Mobility' and site startswith '256'
分裂应该给我以下内容:
字符串1 = phoneNumber eq 763436
字符串2 =运营商eq' AT和T Mobility'
字符串3 =站点以256开始
更多字符串1 2和3应分成
String operator = phoneNumer String operator = eq String operand = 763436
String operator = carrier String operator = eq String operand = AT and T Mobility
String operator = site String operator = startswith String operand = 256
我可以分别使用string.split("和")和split("")分别用于外部和内部,但我的字符串也包含空格和(例如AT和T Mobility)。一个帮助是,只有在引号内的运算符中才会出现额外和空格。
任何帮助如何在java中拆分?
答案 0 :(得分:2)
由于split
是基于正则表达式的,如果我正确地阅读了这个问题,您可以将其拆分为:
String[] split = yourString.split("(and)|\s+");
修改强>:
我会诚实地建议您自己解析字符串以获取特定的内容,而不是通过正则表达式进行拆分:
public String[] parseRawString(String raw) {
List<String> args = new ArrayList<>();
StringBuilder sb = new StringBuilder();
//whether or not to split on spaces
boolean inQuotes = false;
for (char c : raw.toCharArray()) {
//if a quote is found
if (c == '\'') {
inQuotes = !inQuotes;
//if a space is found outside quotes
} else if (char == ' ' && !inQuotes) {
args.add(sb.toString());
sb.clear();
//if a normal character is found or we're inside a quote
} else if (char != ' ' || inQuotes) {
sb.append(c);
}
}
//add any last remnants that weren't added before the end
if (!sb.isEmpty()) {
args.add(sb.toString());
}
return args.toArray(new String[args.size()]);
}
这样可以更轻松地解析:
String[] one = parseRawString("phoneNumber eq 763436");
/*
one[0] = phoneNumber
one[1] = eq
one[2] = 763436
*/
String[] two = parseRawString("carrier eq 'AT and T Mobility'");
/*
two[0] = carrier
two[1] = eq
two[2] = AT and T Mobility
*/
//etc...
我相信这似乎更接近你想要的东西。
答案 1 :(得分:0)
由于您希望将这些字符串作为键,操作数,值,您可以尝试使用
String regex="(?<key>\\S+)\\s+(?<operator>\\S+)\\s+(?<value>'[^']*'|\\S+)";
for(String s:filter.split("\\s*and\\s*(?=([^']*'[^']*')*[^']*$)"))
{
Matcher m=Pattern.compile(regex).matcher(s);
while(m.find())
{
System.out.println("Key:"+m.group("key"));
System.out.println("operator:"+m.group("operator"));
System.out.println("Value:"+m.group("value"));
}
}
答案 2 :(得分:0)
查看此答案。 它的工作
<强>方案:强>
String filter = "phoneNumber eq 763436 and carrier eq 'AT and T Mobility' and site startswith 256";
String[] split = filter.split("\\s*and\\s*(?=([^']*'[^']*')*[^']*$)");
for (String s : split) {
String[] split1 = s.trim().split(" ",3);
for (String s1 : split1) {
System.out.println(""+s1.replaceAll("'", ""));
}
}
<强>输出:强>
phoneNumber
eq
763436
carrier
eq
AT and T Mobility
site
startswith
256
查看更新的程序,因为它适用于所有类型的输入字符串,如下所示
1.String filter =&#34;&#39;电话号码&#39; eq&#39; 763436&#39;和运营商eq&#39; AT和T Mobility&#39;和网站&#39;开始&#39; &#39; 256&#39;&#34 ;; 强>
2.String filter =&#34;&#39;电话号码&#39; eq&#39; 763436&#39;和运营商eq&#39; AT和T Mobility&#39;和网站&#39;以&#39;开头&#39; 256&#39;&#34 ;; 强>
3.String filter =&#34;&#39;电话和号码&#39; eq&#39; 763436&#39;和运营商eq&#39; AT和T Mobility&#39;和网站&#39;以&#39;开头&#39; 256&#39;&#34 ;; 强>
4.String filter =&#34; phoneNumber eq&#39; 763436&#39;和运营商eq&#39; AT和T Mobility&#39;并且网站以&#39; 256&#39;&#34;;
开头5.String filter =&#34; phoneNumber eq 763436 and carrier eq&quot; AT and T Mobility&#39;并且网站以256&#34;;
开头你可以将更多的字符串与上面的字符串一起用作单引号。它们可以为所有字符串工作..
更新的计划
String filter = "'phone Number' eq 763436 and carrier eq 'AT and T Mobility' and site 'startswith' '256'";
String[] split = filter.split("\\s*and\\s*(?=([^']*'[^']*')*[^']*$)");
for (String s : split) {
String[] split1 = s.trim().split("\\s* \\s*(?=([^']*'[^']*')*[^']*$)");
for (String s1 : split1) {
System.out.println("" + s1.replaceAll("'", ""));
}
}
<强>输出:强>
phone Number
eq
763436
carrier
eq
AT and T Mobility
site
startswith
256
检查更新的代码并更新状态