CF Regex REFind()不带引号的子字符串

CF Regex REFind()不带引号的子字符串,regex,coldfusion,text-extraction,data-extraction,Regex,Coldfusion,Text Extraction,Data Extraction,我的CF后端必须像读取文本文件一样读取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.M

我的CF后端必须像读取文本文件一样读取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;
正如你所看到的,我可以有单引号或双引号的字符串

我也有布尔值和数字,它们通常没有引号,但也可以有(单引号或双引号)

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

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;
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# >


例如,它返回
blabla”
,它成功地省略了开头的引号,但没有省略最后一个,我做错了什么?

从您的评论中,听起来好像您要解析两行任意的行。这样做:

^(?:[^\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
还可以看到这个可视化,它使它非常清晰


我想知道是否更容易在每一行预先挂起一个字符串,然后执行代码,从而用值填充本地结构。您是否已经问过这个问题?不确定@KevinB是什么意思,我确实想填充一个本地结构,在发送JSON之前将其序列化,问题是我当前的实现在上,结果将是例如:“1337”,因为JSON认为它是字符串而不是数字。用我的正则表达式去掉引号会解决所有这些麻烦,JSON会在知道它是字符串的情况下重新添加引号,不会为布尔值和数字重新添加引号。你可以通过检查值并强制将值设置为数字或布尔值(如果它们是数字或布尔值)来解决这个问题。我只是不喜欢使用regexp来解决这个问题,它可能很容易崩溃。例如,要解决您的问题,您需要将
(.*)
匹配到最后一个匹配的引号/apos。这有几种方法可以解决,但没有一种是防弹的,用
变量.config
查找/替换
请求.config
,将文件保存到
ram://
,包括它,删除文件,然后访问
变量.config
的属性。然后可以迭代这些属性,将字符串数字和字符串布尔值转换为数字和布尔值。当然,这引入了一个地方,如果您不信任构建此配置文件的人,可能会有人插入恶意代码。我想从2个匹配项中提取值,第一个示例是:MY_PARAM_1和ABCDEFGHI,但不带引号。例如#5,它将是:我的#参数#5和1337。这是我的requirements@dominicbri7你能解释一下我的参数1和参数5有什么特别之处吗?也就是说,我如何知道匹配这些而不是另一个?是关于报价的吗?或者关于它们在参数列表中的位置(一个是第一个,另一个是第五个)?@dominicbri7如果你说你想要具体的第1行和第5行,请参阅我答案顶部的附加正则表达式。如果没有,请解释我们使用什么标准来确定选择哪两行。:)我只给出了#1和#5作为示例,我正在寻找一个可以返回这些值的正则表达式results@dominicbri7我刚刚添加了一个表达式,可以让您捕获任意两行。这在我的答案的顶部。:)