我正在为一些Oracle命令编写解析器,比如
LOAD DATA
INFILE /DD/DATEN
TRUNCATE
PRESERVE BLANKS
INTO TABLE aaa.bbb
( some parameters... )
Run Code Online (Sandbox Code Playgroud)
我已经创建了一个匹配整个命令的正则表达式.我现在正在寻找一种捕获输入文件名称的方法(例如"/ DD/DATEN").我的问题是使用以下正则表达式只会返回第一组的最后一个字符("N").
^\s*LOAD DATA\s*INFILE\s*(\w|\\|/)+\s*$
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?提前谢谢了
编辑:关于@HamZa的问题,这里将是解析Oracle LOAD 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*$
Run Code Online (Sandbox Code Playgroud)

让我们指出正则表达式中的错误行为者(\w|\\|/)+。这里会发生什么?
您要匹配一个单词字符或一个后斜杠/正斜杠,然后将其放入组 1,(\w|\\|/)然后告诉正则表达式引擎执行此操作一次或多次+。您真正想要的是在对这些字符进行分组之前将它们匹配几次。因此,您可能会使用不匹配的组(?:):((?:\w|\\|/)+)。
您可能会注意到,毕竟您可以只使用字符类([\w\\/]+)。因此,你的正则表达式可能看起来像
^\s*LOAD DATA\s*INFILE\s*([\w\\/]+)\s*$
Run Code Online (Sandbox Code Playgroud)
附带说明:$如果您不使用多行模式,则结束锚点将导致您的正则表达式失败。或者您是故意没有发布完整的正则表达式:)?