RegEx:捕获整个组内容

时间:2013-11-10 19:19:37

标签: regex parsing

我正在编写一些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*$

Regular expression visualization

Debuggex Demo

有什么想法吗? 非常感谢提前

编辑:关注@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*$

Regular expression visualization

Debuggex Demo

2 个答案:

答案 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*$