我有一个字符串“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");
}
答案 0 :(得分:2)
您可以尝试:
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源
(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));
}
}
答案 1 :(得分:0)
您可以使用此正则表达式:
(?sim)update\s(.*?)\sset\s(.*?)\s(where=?.*?)$
Group 1
- TEMP
Group 2
- COL1 = -1且COL2 =&#39; val&#39;
Group 3
- 其中COL3&gt; 45