技术细节
我想从包含参数名称和值的文本文件中提取值。对于以“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
答案 0 :(得分:1)
您不希望REMatch
,想要REFind
(docs):
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
将是一个包含两个键(POS
和LEN
)的结构,列出每个子匹配的位置和长度。
然后,您可以将此信息提供给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])#