我的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"
,它已成功省略了开头的引用,但不是最后一个,我做错了什么?
答案 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
另见这种可视化,非常清楚。