Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带短语替换的正则表达式_Java_Regex - Fatal编程技术网

Java 带短语替换的正则表达式

Java 带短语替换的正则表达式,java,regex,Java,Regex,我正在尝试使用regex获取字符串上的短语列表,我需要获取以下内容: - "teste" on: CREATE TABLE teste or CREATE TABLE IF NOT EXISTS teste 我正在尝试这个: CREATE (TABLE|TABLE IF NOT EXISTS) ([a-zA-Z]+) 有什么建议吗 谢谢 --更新 我只需要“测试”。。。如果我需要在“表组”上使用括号,如何在这个表达式中使用它?您的表达式没有按预期工作,因为交替运算符()的操作数顺序对某些

我正在尝试使用
regex
获取字符串上的短语列表,我需要获取以下内容:

- "teste"
on:
CREATE TABLE teste 
or
CREATE TABLE IF NOT EXISTS teste
我正在尝试这个:

 CREATE (TABLE|TABLE IF NOT EXISTS) ([a-zA-Z]+)
有什么建议吗

谢谢

--更新


我只需要“测试”。。。如果我需要在“表组”上使用括号,如何在这个表达式中使用它?

您的表达式没有按预期工作,因为交替运算符(
)的操作数顺序对某些引擎很重要。发生的是:一旦匹配<代码>表< /代码>,引擎将<强> > < /强>继续并尝试匹配第二操作数(<代码>表,如果不……/代码>),因为它将考虑组匹配并继续,因此<>代码>如果……/代码>部分将匹配<代码>([AZ-Z+])< /Cord>表达式> < /P>
最干净/最安全的解决方案是使用
运算符使表达式可选:

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

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


还要注意,示例中的单词
“teste”
将与第二组的匹配。如果希望与第一个组匹配,请使用非捕获组(通过
?:
),如中所示:


你们需要确保你们也忽略了这个案例。表名可以包含数字

(CREATE TABLE|CREATE TABLE IF NOT EXISTS)\s+(\w+)
你可能想

  • 接受所有空白字符,而不仅仅是空格(
    \s+
  • 查找所有事件(
    /g
    或Java中不区分大小写)
  • 搜索不区分大小写(
    /i

/创建\s+表\s+(如果不存在)?\s+([a-zA-Z]+)/gi

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

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));

你能解释一下“这不合理”是什么意思吗?如果你的正则表达式不起作用,告诉我们你使用的是哪种工具或编程语言也会有帮助!我不是要你把它改回去,虽然它是可以的,但我很好奇,你为什么要改变被接受的答案?在这种情况下,我无法匹配(…表…)所以。。。我只需要匹配“teste”,我怎么做?谢谢
table: foo
table: bar
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));