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)
我想知道的是,如何在我的字符串中查找包含在一组{}
括号内的所有字符串?我想将所有匹配的字符串拆分成一个数组,以便我可以使用查询数据的结果.
这也是在匹配字符串中处理字符串以合并变量数据的常用模式吗?
任何帮助非常感谢.
要查找所有包含大括号的字符串,可以使用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)
(因为这是标准替换,所以不需要使用反斜杠来逃避括号;它们在这里没有特殊含义.)