【发布时间】:2014-06-30 01:10:26
【问题描述】:
技术细节
我想从包含参数名称和值的文本文件中提取值。对于以“request.config”开头的每一行。 (有空行、带有 cmets 的行等,我不想从中提取任何东西)我想提取这些值(粗体):
request.config.my_param_1 = "一些随机字符串";
我认为最好的方法可能是使用 REGEX,但我该怎么做呢?
我认为会有类似于正则表达式的东西,它会提取两个值 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">
不幸的是,这段代码给了我我已经拥有的完整字符串,我只想要两个提取的值!
一些 META:我想要做什么
我正在构建一个 Web 应用程序,它允许最终用户修改一些存储在 params_file.cfm 中的应用程序参数。我们希望能够在应用程序中完成,而不是让开发人员手动更改文件中的变量。
我的应用程序首先对后端进行 AJAX 调用,它读取 params 文件,获取所有数据对(param_name、param_value 以及可能稍后在 param_description 上)并将它们作为 JSON 返回以填充我的列表自动完成工具按名称搜索它们(好奇的 Typeahead.js)。当我选择一个参数名称时,该值与一些用于修改它们的控件一起出现(这些控件取决于数据类型,JQuery 用于确定类型)。
问题是 param_value 可以有多种形式。因为这个 params 文件由不同的人维护,它可以有不同的语法。例如,布尔值可以存储为“真”、“真”、真、真(你明白了)。
由于 SerializeJSON 处理类型(布尔值、数字、字符串),我认为我的 REGEX 应该返回不带引号的文本(单引号或双引号),但我在制作该表达式时遇到了麻烦。
我明白了
<cfset match = REFind("^request\.config\.(\S+) = ['|""]?(.*)['|""]?;$", str, 1, "Yes")>
我用request.config.my_param_1 = 'MYTEST123'; 对其进行了测试,它只删除了第一个单引号,由于某种原因,当我不想要任何周围的引号时,表达式返回我MYTEST123'。我的正则表达式需要帮助
【问题讨论】:
-
为什么你解析文件而不是仅仅包含它?
-
如果你真的有正当的理由用正则表达式来解析它,你需要更具体的格式 - 即预期/可接受的内容,特别是关于换行符/分号,转义引号,文字结构,等
-
所以你的文件有一个 CF 结构......为什么不只包含文件,循环你的结构提取键:值对并根据需要将它们放入自己的变量中(虽然我有和@PeterBoughton一起去问为什么)?
-
“我必须将其作为文本文件读取” - 是的,我明白了。我在问为什么。 What are you trying to do?
-
"我的应用程序首先对后端进行 AJAX 调用,它读取 params 文件,获取所有数据对(param_name、param_value 以及可能稍后的 param_description)并将它们作为 JSON 返回" - 将数据存储为 JSON。然后您可以
deserializeJson()进行解析并使用StructKeyArray 等函数以编程方式获取已定义的键等。
标签: regex coldfusion extract text-parsing text-extraction