0

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

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;

如您所见,我可以有可以单引号或双引号的字符串。

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

我正在“解析”文件并提取值,我想找到一个返回匹配项的模式,如下所示:

请求配置。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",它已经成功省略了开头引号,但不是最后一个,我做错了什么?

4

1 回答 1

2

从您的评论中,听起来您是在说您要解析两条任意行。这将做到:

^(?:[^\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 组中。请参阅此演示右下面板中的捕获组

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

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

另请参阅此可视化,它非常清楚。

正则表达式可视化

调试演示

于 2014-05-12T20:17:24.407 回答