我正在尝试使用regex
获取字符串上的短语列表,我需要这样做:
- "teste"
on:
CREATE TABLE teste
or
CREATE TABLE IF NOT EXISTS teste
我正在尝试这个:
CREATE (TABLE|TABLE IF NOT EXISTS) ([a-zA-Z]+)
任何sugestions?
谢谢!
- 更新
我只需要获得“teste”...如果我需要在“table group”上使用括号,我怎么能得到这个表达式呢?
答案 0 :(得分:1)
您的表达式未按预期工作,因为交替运算符(|
)的操作数的顺序对某些引擎很重要。会发生什么:一旦匹配TABLE
,引擎将不继续并尝试匹配第二个操作数(TABLE IF NOT...
),因为它会认为该组匹配并且去因此,IF NOT...
部分将与([a-zA-Z]+)
表达式匹配。
最干净/最安全的解决方案将使用?
运算符使表达式成为可选:
CREATE TABLE( IF NOT EXISTS)? ([a-zA-Z]+)
或者更改交替运算符|
中操作数的顺序(这对某些引擎很重要):
CREATE (TABLE IF NOT EXISTS|TABLE) ([a-zA-Z]+)
另请注意,您示例中的单词"teste"
将与第二组匹配。如果您希望它与第一组匹配,请使用非捕获组(通过?:
),如下所示:
CREATE TABLE(?: IF NOT EXISTS)? ([a-zA-Z]+)
答案 1 :(得分:1)
你可能想要
\s+
)/g
或CASE_INSENSITIVE)/i
)
/create\s+table\s+(if not exists)?\s+([a-zA-Z]+)/gi
当此正则表达式匹配时,可以在第二个匹配组中找到表名。根据您的环境,您可以使用\2
,$2
,group(2)
等访问它。
在Java中,你必须转义反斜杠,这使得它更难阅读。这是一个Java示例:
@Test
public void test() {
Pattern pattern = Pattern.compile("create\\s+table\\s+(if\\s+not\\s+exists\\s+)?([a-zA-Z]+)", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("bla bla CREATE TABLE foo; bla bla create table if not exists bar;");
while (matcher.find()) {
System.out.println("table: " + matcher.group(2));
}
}
将打印:
table: foo
table: bar
答案 2 :(得分:1)
Balancin,你想在java中找到它吗?
String regexToFind = ".*[tT][eE][sS][tT][eE].*";
String inputOk = "CREATE TABLE teste ";
String inputNotOk = "CREATE TABLE notok ";
System.out.println(inputOk.matches(regexToFind));
System.out.println(inputNotOk.matches(regexToFind));
答案 3 :(得分:0)
您还需要确保忽略大小写。表名可以包含数字。
(CREATE TABLE|CREATE TABLE IF NOT EXISTS)\s+(\w+)