我正在编写一些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*$
有什么想法吗? 非常感谢提前
编辑:关注@HamZa的问题,这里将是解析Oracle LOAD DATA INFILE command的整个正则表达式(虽然简化了):
^\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*$
答案 0 :(得分:3)
让我们指出你的正则表达式(\w|\\|/)+
中的不法行为者。这里发生了什么?
您正在匹配单词字符或后退/前进并将其放入组1 (\w|\\|/)
之后,您告诉正则表达式引擎执行此操作一次或多次+
。你真正想要的是在分组之前多次匹配这些字符。因此,您可以使用不匹配的群组(?:)
:((?:\w|\\|/)+)
。
您可能会注意到,您可以在所有([\w\\/]+)
之后使用字符类。因此,你的正则表达式看起来像
^\s*LOAD DATA\s*INFILE\s*([\w\\/]+)\s*$
旁注:如果您没有使用多线模式,那么结束锚$
将导致您的正则表达式失败。或者是你故意没有发布完整的正则表达式:)?
答案 1 :(得分:2)
未经测试但......
^\s*LOAD DATA\s*INFILE\s*(\S+)\s*$