ColdFusion从文本文件中提取值

时间:2014-05-12 15:24:18

标签: regex coldfusion extract text-parsing text-extraction

技术细节

我想从包含参数名称和值的文本文件中提取值。对于以“request.config”开头的每一行。 (有空行,带注释的行等,我不想从中提取任何内容)我想提取这些值(粗体):

request.config。 my_param_1 = “一些随机字符串”;

我认为最好的方法可能是使用REGEX,但我该怎么办呢?

我认为会有类似正则表达式的东西,它会为每一行提取2个值request.config.${1} = ${2};并检索$ {1}和$ {2},但前提是它匹配。

我尝试过尝试,但没有用:

<cfset str = "request.config.MY_PARAM_NAME = 'The parameter VALUE!!';">
<cfset arrSearch = rematch("^request.config.(.*?) = (.*?);$", str) >
<cfdump var="#arrSearch#" label="Extracted values">

不幸的是,这段代码给了我已经拥有的完整字符串,我只想要2个提取的值

某些META:我正在尝试做什么

我正在构建一个Web应用程序,允许最终用户修改存储在params_file.cfm中的一些应用程序参数。我们希望能够在应用程序中完成变更,而不是让开发人员在文件中手动更改变量。

我的应用程序首先对后端进行AJAX调用,后端读取params文件,获取所有数据对(param_name,param_value以及稍后可能在param_description上)并将它们作为JSON返回以填充我的列表,我有一个自动完成工具按名称搜索它们(Typeahead.js为好奇)。当我选择一个参数名称时,该值会与一些控件一起出现以修改它们(控件取决于数据类型,JQuery用于确定类型)。

事情是param_value可以采取多种形式..因为这个params文件由不同的人维护,它可以有不同的语法。例如,布尔值可以存储为“TRUE”,“true”,TRUE,true(您明白了)。

由于SerializeJSON处理类型(布尔值,数字,字符串),我认为我的REGEX应该返回没有引号的文本(单引号或双引号)但是我在制作表达式时遇到了麻烦。

我得到了

<cfset match = REFind("^request\.config\.(\S+) = ['|""]?(.*)['|""]?;$", str, 1, "Yes")>

我用request.config.my_param_1 = 'MYTEST123';对其进行了测试,仅删除了第一个单引号,由于某种原因,当我不想要任何周围的引用时,表达式会返回MYTEST123' 。我需要帮助我的REGEX

2 个答案:

答案 0 :(得分:1)

您不希望REMatch,想要REFinddocs):

REFind(reg_expression, string [, start, returnsubexpressions ] )

returnsubexpressions是你需要的,所以...

<cfset str = "request.config.MY_PARAM_NAME = 'The parameter VALUE!!';">
<cfset match = REFind("^request\.config\.(\S+) = (.*);", str, 1, "Yes")>

<cfdump var="#match#">

match将是一个包含两个键(POSLEN)的结构,列出每个子匹配的位置和长度。

然后,您可以将此信息提供给Mid()并删除实际的子字符串。

不要忘记检查REFind是否成功,ArrayLen(match.POS)在您的情况下必须为3(1个整体匹配,2个匹配组,请$0 .. $2 )。

要查找整个文件中的所有匹配项,请

  • 循环运行此功能,将start设置为match.POS[1] + match.LEN[1]以进行下一次迭代
  • 或以逐行方式循环浏览文件,通过<cfloop list>以换行符Chr(10)作为分隔符,或通过<cfloop array>ArrayToList(file, Chr(10))

答案 1 :(得分:1)

你想尝试refind(),而不是rematch()因为它返回可用于获取和找到子表达式的数组数据

arrsearch = rematch("^request.config.(.*?) = (.*?);$", line)

只返回整行: #Mid(line,arrsearch.pos[0],arrsearch.len[0])#

返回第一个子表达式(varname): #Mid(line,arrsearch.pos[1],arrsearch.len[1])#

返回第二个子表达式(value): #Mid(line,arrsearch.pos[2],arrsearch.len[2])#