正则表达式与短语替代

时间:2014-01-02 20:22:38

标签: java regex

我正在尝试使用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”上使用括号,我怎么能得到这个表达式呢?

4 个答案:

答案 0 :(得分:1)

您的表达式未按预期工作,因为交替运算符(|)的操作数的顺序对某些引擎很重要。会发生什么:一旦匹配TABLE,引擎将继续并尝试匹配第二个操作数(TABLE IF NOT...),因为它会认为该组匹配并且去因此,IF NOT...部分将与([a-zA-Z]+)表达式匹配。


最干净/最安全的解决方案将使用?运算符使表达式成为可选:

CREATE TABLE( IF NOT EXISTS)? ([a-zA-Z]+)

Demo here.

或者更改交替运算符|中操作数的顺序(这对某些引擎很重要):

CREATE (TABLE IF NOT EXISTS|TABLE) ([a-zA-Z]+)

Demo for this second one


另请注意,您示例中的单词"teste"将与第二组匹配。如果您希望它与第一组匹配,请使用非捕获组(通过?:),如下所示:

CREATE TABLE(?: IF NOT EXISTS)? ([a-zA-Z]+)

答案 1 :(得分:1)

你可能想要

  • 接受所有空格字符,而不只是空格(\s+
  • 在Java中找到所有次出现(/g或CASE_INSENSITIVE)
  • 搜索不区分大小写(/i

/create\s+table\s+(if not exists)?\s+([a-zA-Z]+)/gi

当此正则表达式匹配时,可以在第二个匹配组中找到表名。根据您的环境,您可以使用\2$2group(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+)