我有一个字符串“UPDATE TEMP SET COL1 = -1,COL2 ='val'其中COL3> 45”
Now I want to fetch the following
我想在java中使用模式匹配来做到这一点
这是我尝试过但我需要一些更好的方法
Pattern p = Pattern.compile("^UPDATE (\\w+) (SET) (.*) (WHERE.*)$");
Matcher m = p.matcher(s.toUpperCase());
if (m.find()) {
String group1 = m.group(1);
String group3 = m.group(3);
String group4 = m.group(4);
System.out.println("Group1: "+group1);
System.out.println("Group3: "+group3);
System.out.println("Group3: "+group4);
} else {
System.out.println(" No match found");
}
你可以尝试:
update\s+(\w+)\s+|(\S+\s*=\s*\S+)(?=.*where)|(where.*)
说明:
情况1:
update\s+(\w+)\s+
寻找字符串更新,然后是白线\s+
...接着是\w+
,即a-zA-Z0-9
多次,在你的例子中是TEMP,后面是一个或多个空格,即\s+
案例2:
\S+\s*=\s*\S+(?=.*where)
在您的情况下为COL1的\S+
非空白字符,后跟一个或多个空格字符,后跟=,后跟一个或多个空白字符,后跟示例中的非空白字符-1或val
(?=.*where)
它确保这些键值对最终处于领先地位
案例3:
(where.*)
它捕获从何处开始到结束的所有内容
示例Java源代码
(Qazxswpoi):
run here
你可以使用这个正则表达式:
final String regex = "update\\s+(\\w+)\\s+|(\\S+\\s*=\\s*\\S+)(?=.*where)|(where.*)";
final String string = "UPDATE TEMP SET COL1 = -1 , COL2 = 'val' Where COL3 > 45\n";
final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
for (int i = 1; i <= matcher.groupCount(); i++) {
if(matcher.group(i)!=null)
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
(?sim)update\s(.*?)\sset\s(.*?)\s(where=?.*?)$
- TEMP
Group 1
- COL1 = -1且COL2 ='val'
Group 2
- COL3> 45