使用正则表达式解析字符串中的变量

use*_*202 1 regex coldfusion coldfusion-8

我对ColdFusion的正则表达式有一些问题.

我有一个字符串:

Hi my name is {firstname}. and i live in {towncity} my email address is {email}
Run Code Online (Sandbox Code Playgroud)

我想知道的是,如何在我的字符串中查找包含在一组{}括号内的所有字符串?我想将所有匹配的字符串拆分成一个数组,以便我可以使用查询数据的结果.

这也是在匹配字符串中处理字符串以合并变量数据的常用模式吗?

任何帮助非常感谢.

Pet*_*ton 5

简单的答案

要查找所有包含大括号的字符串,可以使用rematch和简单表达式\{[^{}]+\}

说明

\每个支撑之前的反斜杠都是为了逃避它们,并让它们作为文字括号(否则它们带有特殊含义).

[^... ]是负字符类,说匹配任何单个字符是不是那些包含在一个和贪婪的+量词告诉它要尽可能多的匹配,但至少有一个,从前面的项目.

因此[^{}]+,在大括号之间使用意味着它将不匹配嵌套或不匹配的大括号.(虽然使用\{.*?\}可以匹配两个开口括号.注意:这*?是一个懒惰的量词,它不匹配任何东西(如果可能的话),但需要多少.)

扩展答案

但是,由于您说结果来自查询,因此只匹配您正在处理的值的方法是使用查询的ColumnList来形成表达式:

`\{(#ListChangeDelims(QueryName.ColumnList,'|')#)\}`
Run Code Online (Sandbox Code Playgroud)

这会将ColumnList更改为以管道分隔的列表 - 一组备选项,按括号分组 - 即生成的模式将如下所示:

 \{(first_name|towncity|email)\}
Run Code Online (Sandbox Code Playgroud)

(该组的内容进入捕获组1).

要实际填充文本(而不仅仅是匹配),你可以做类似的事情,除了这里不需要正则表达式,只是在循环遍历列时直接替换:

<cfloop index="CurColumn" list=#QueryName.ColumnList#>
    <cfset text = replace( text , '{#CurColumn#}' , QueryName[CurColumn][CurrentRow] , 'all' ) />
</cfloop>
Run Code Online (Sandbox Code Playgroud)

(因为这是标准替换,所以不需要使用反斜杠来逃避括号;它们在这里没有特殊含义.)