CF Regex REFind()没有引号的子字符串

时间:2014-05-12 20:11:42

标签: regex coldfusion text-extraction data-extraction

我的CF后端必须读取CFM文件,好像它是一个TEXT文件来提取不同参数的名称和值,数据如下所示:

request.config.MY_PARAM_1 = 'ABCDEFGHI';
request.config.MY_PARAM_2 = "BlaBlaBla";
request.config.MY_PARAM_3 = TRUE;
request.config.MY_PARAM_4 = 'true';
request.config.MY_PARAM_5 = "1337";
request.config.MY_PARAM_6 = 1337;

正如你所看到的,我可以有STRINGS,可以是单引号或双引号。

我也有BOOLEANS和NUMBERS,通常没有引号,但也可以有(单或双)。

我正在解析"文件和提取值,我想找到一个返回匹配的模式:

request.config。 MY_PARAM_2 =" BlaBlaBla ";

我非常接近成功,但遗憾的是以下表达式无法摆脱​​收尾报价。

<cfset match = REFind("^request\.config\.(\S+) = ['|""]?(.*)['|""]?;$", str, 1, "Yes")>
<cfset paramVal = Mid( str, match.pos[3], match.len[3] ) >
<cfdump var=#paramVal# >

例如,它返回BlaBlaBla",它已成功省略了开头的引用,但不是最后一个,我做错了什么?

1 个答案:

答案 0 :(得分:2)

根据您的评论,听起来您说要解析两个 ARBITRARY 行。这样就可以了:

^(?:[^\n]*\n){1}request\.config.(\w+)\s*=\s*(['"]?)(\w+)\2;(?:[^\n]*\n){4}request\.config.(\w+)\s*=\s*(['"]?)(\w+)\5;

在您的代码中,只需更改量词中的两个数字:{1}{4},因为它们指定在顶部和中间跳过多少行。例如,对于第1行,您将在第一个量词中使用{0}

您想要的数据位于第1组,第3组,第4组和第5组中。请参阅this demo

右下方面板中的捕获组

我相信你可以通过连接各个部分来构建代码中的正则表达式:

method Parse(x,y)
Build the regex by concatenating
^(?:[^\n]*\n){
With 
x-1
With
}request\.config.(\w+)\s*=\s*(['"]?)(\w+)\2;(?:[^\n]*\n){
With
y-x
With
}request\.config.(\w+)\s*=\s*(['"]?)(\w+)\5;

Then match and retrieve Groups 1, 3, 4 and 5

另见这种可视化,非常清楚。

Regular expression visualization

Debuggex Demo