在java中使用Regex获取组

问题描述 投票:-2回答:2

我有一个字符串“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");
        }
java regex
2个回答
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源代码

(Qazxswpoi):

run here

0
投票

你可以使用这个正则表达式:

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

© www.soinside.com 2019 - 2024. All rights reserved.