在java中使用Regex获取组

时间:2017-12-20 09:58:09

标签: java regex

我有一个字符串“UPDATE TEMP SET COL1 = -1,COL2 ='val'其中COL3> 45”

Now I want to fetch the following
  • 在UPDATE之后获取字符串值 TEMP
  • 在Set之后获取所有组 COL1 = -1 COL2 ='val'
  • 在COL2 ='val'之后得到整个字符串,这是其中COL3> 45

我想在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");
        }

2 个答案:

答案 0 :(得分:2)

您可以尝试:

update\s+(\w+)\s+|(\S+\s*=\s*\S+)(?=.*where)|(where.*)

Regex Demo

说明:

案例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