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

Regex 使用正则表达式解析字符串中的变量,regex,coldfusion,coldfusion-8,Regex,Coldfusion,Coldfusion 8,我对使用ColdFusion的正则表达式有点问题 我有一个字符串: Hi my name is {firstname}. and i live in {towncity} my email address is {email} 我想知道的是,我将如何在我的字符串中查找封装在一组{}括号中的所有字符串?我想将所有匹配的字符串分割成一个数组,以便使用查询数据的结果 这也是处理匹配字符串中的字符串以合并变量数据的常用模式吗 非常感谢您的帮助。可能有更好的方法来实现这一点,但是使用类似于重新匹配(“{

我对使用ColdFusion的正则表达式有点问题

我有一个字符串:

Hi my name is {firstname}. and i live in {towncity} my email address is {email}
我想知道的是,我将如何在我的字符串中查找封装在一组
{}
括号中的所有字符串?我想将所有匹配的字符串分割成一个数组,以便使用查询数据的结果

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


非常感谢您的帮助。

可能有更好的方法来实现这一点,但是使用类似于
重新匹配(“{.*?}”,yourstring)
的方法将为您提供一个包含所有匹配项的数组


为了将来的参考,我使用了一个非常好的在线正则表达式检查器。完全公开,这不是专门针对ColdFusion的,但它是一种很好的测试方法。

可能有更好的方法来实现这一点,但是使用类似于
重新匹配(“{.*?}”,yourstring)
的方法将为您提供一个包含所有匹配项的数组

为了将来的参考,我使用了一个非常好的在线正则表达式检查器。完全公开,它不是专门针对ColdFusion的,但它是一种很好的测试方法。

使用
重新匹配(reg\u表达式,字符串到搜索)
功能

有关Coldfusion 10中正则表达式的详细信息如下。(我相信CF8中的regexp大致相同。)

使用以下代码

<cfset str = "Hi my name is {firstname}. And I live in {towncity} my email address is {email}.">
<cfoutput>Search string: <b>#str#</b><br />Search result:<br /></cfoutput>
<cfset ret = reMatch("\{[\w\s\(\)\+\.@-]+\}", str)>
<cfdump var ="#ret#">
结果将是一个包含以下条目的数组

  • {John Galt}
  • {圣彼得堡}
  • {john@exam_ple.com}
使用
重新匹配(reg\u表达式、字符串到搜索)
功能

有关Coldfusion 10中正则表达式的详细信息如下。(我相信CF8中的regexp大致相同。)

使用以下代码

<cfset str = "Hi my name is {firstname}. And I live in {towncity} my email address is {email}.">
<cfoutput>Search string: <b>#str#</b><br />Search result:<br /></cfoutput>
<cfset ret = reMatch("\{[\w\s\(\)\+\.@-]+\}", str)>
<cfdump var ="#ret#">
结果将是一个包含以下条目的数组

  • {John Galt}
  • {圣彼得堡}
  • {john@exam_ple.com}
简单的答案 要查找所有用大括号括起来的字符串,可以使用和简单表达式
\{[^{}]+\}

解释 每个大括号前的反斜杠
\
用于转义它们,并使它们充当文字大括号(否则它们具有特殊含义)

[^
..
]
是一个负字符类,表示匹配任何不包含在其中的字符,贪婪的
+
量词告诉它匹配前一项中尽可能多的字符,但至少一个

因此,在大括号之间使用
[^{}]+
意味着它将不匹配嵌套或不匹配的大括号。(当使用
\{.*?\}
时,可能会匹配两个大括号。注意:
*?
是一个惰性量词,它不匹配任何内容(如果可能),但匹配的数量会根据需要而定。)

扩展答案 但是,由于您说结果来自查询,因此仅匹配您正在处理的值的一种方法是使用查询的列列表来形成表达式:

`\{(#ListChangeDelims(QueryName.ColumnList,'|')#)\}`
这会将ColumnList更改为管道分隔列表(一组备选方案,按括号分组),即生成的模式如下所示:

 \{(first_name|towncity|email)\}
(该组的内容进入捕获组1)

要实际填充文本(而不仅仅是匹配),您可以执行类似的操作,但此处不需要正则表达式,只需在列中循环使用直线:

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

(因为这是一个标准的替换,所以没有必要用反斜杠来避开大括号;它们在这里没有特殊意义。)

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

解释 每个大括号前的反斜杠
\
用于转义它们,并使它们充当文字大括号(否则它们具有特殊含义)

[^
..
]
是一个负字符类,表示匹配任何不包含在其中的字符,贪婪的
+
量词告诉它匹配前一项中尽可能多的字符,但至少一个

因此,在大括号之间使用
[^{}]+
意味着它将不匹配嵌套或不匹配的大括号。(当使用
\{.*?\}
时,可能会匹配两个大括号。注意:
*?
是一个惰性量词,它不匹配任何内容(如果可能),但匹配的数量会根据需要而定。)

扩展答案 但是,由于您说结果来自查询,因此仅匹配您正在处理的值的一种方法是使用查询的列列表来形成表达式:

`\{(#ListChangeDelims(QueryName.ColumnList,'|')#)\}`
这会将ColumnList更改为管道分隔列表(一组备选方案,按括号分组),即生成的模式如下所示:

 \{(first_name|towncity|email)\}
(该组的内容进入捕获组1)

要实际填充文本(而不仅仅是匹配),您可以执行类似的操作,但此处不需要正则表达式,只需在列中循环使用直线:

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


(因为这是一个标准的替换,所以没有必要用反斜杠来替换大括号;它们在这里没有特殊意义。)

coldfusion标记reFind()和reReplace()可能会有用。我不喜欢经常做手术,所以我得上网找一个。ColdFusion还有一个arrayappend()函数,可以用来填充数组,但是关于使用查询数据的结果作为数组的理由的部分听起来很奇怪。ColdFusion标记reFind()和reReplace()可能很有用。我不喜欢经常做手术,所以我得上网找一个。ColdFusion还有一个arrayappend()函数,可以用来填充数组,但是关于使用查询数据的结果作为数组原因的部分听起来很奇怪。您不需要所有这些转义符-
[\w\s\(\)\+\.@-]
wor