正则表达式:捕获整个组的内容

5

我正在编写一个解析器来处理一些Oracle命令,例如

LOAD DATA
  INFILE  /DD/DATEN
TRUNCATE
PRESERVE BLANKS
INTO TABLE aaa.bbb
( some parameters... )

我已经创建了一个正则表达式来匹配整个命令。现在我正在寻找一种方法来捕获输入文件的名称(例如这里的“/DD/DATEN”)。 我的问题是,使用以下正则表达式只会返回第一组的最后一个字符(“N”)。

^\s*LOAD DATA\s*INFILE\s*(\w|\\|/)+\s*$

正则表达式可视化

Debuggex演示

有什么想法吗?非常感谢

编辑:根据@HamZa的问题,这里是解析OracleLOAD DATA INFILE命令的完整正则表达式(虽然简化):

^\s*LOAD DATA\s*INFILE\s*((?:\w|\\|/)+)\s*((?:TRUNCATE|PRESERVE BLANKS)\s*){0,2}\s*INTO TABLE\s*((?:\w|\.)+)\s*\(\s*((\w+)\s*POSITION\s*\(\s*\d+\s*\:\s*\d+\s*\)\s*((DATE\s*\(\s*(\d+)\s*\)\s*\"YYYY-MM-DD\")|(INTEGER EXTERNAL)|(CHAR\s*\(\s*(\d+)\s*\)))\s*\,{0,1}\s*)+\)\s*$

正则表达式可视化

Debuggex演示


2
给问题中相关图片点赞 :) - Vorsprung
2个回答

3
让我们指出您的正则表达式 (\w|\\|/)+ 中的错误。这里会发生什么?
您正在匹配单词字符或反斜杠/正斜杠,并将其放入第1组 (\w|\\|/),然后告诉正则表达式引擎执行一次或多次 +。实际上,您想要匹配这些字符多次,然后对它们进行分组。因此,您可以使用非捕获组 (?:)((?:\w|\\|/)+)

您可能注意到您最终可以使用字符类 ([\w\\/]+)。 因此,您的正则表达式可能如下所示:

^\s*LOAD DATA\s*INFILE\s*([\w\\/]+)\s*$

顺便提一句:如果您没有使用多行模式,那个结尾锚点$将导致您的正则表达式匹配失败。或者您是故意没有发布完整的正则表达式吗 :) ?

1
非常感谢@HamZa提供的全面回答。 - Jérémie

2

没有经过测试,但是...

^\s*LOAD DATA\s*INFILE\s*(\S+)\s*$

感谢@Vorsprung。然而,这不仅匹配反斜杠/正斜杠中的任何一个字符。 - Jérémie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接