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}
我想知道的是如何在我的字符串中找到包含在一组{}
括号中的所有字符串?我想将所有匹配的字符串拆分为一个数组,以便可以使用查询数据的结果。
这也是用于处理匹配字符串中的字符串以合并可变数据的常用模式吗?
非常感谢任何帮助。
要查找所有用大括号括起来的字符串,可以使用rematch和简单表达式\{[^{}]+\}
每个大括号前的反斜杠\
用于转义它们,并让它们充当字面大括号(否则它们具有特殊含义)。
[^
...]
是一个否定字符类,表示匹配不是其中包含的字符之一的任何单个字符,并且贪婪+
量词告诉它匹配前一项中的尽可能多的字符,但至少匹配一个字符。
因此[^{}]+
在大括号之间使用意味着它不会匹配嵌套或不匹配的大括号。(虽然 using\{.*?\}
可以匹配两个左大括号。注意:the*?
是一个惰性量词,它不匹配任何内容(如果可能),但根据需要匹配多个。)
但是,由于您说结果来自查询,因此仅匹配您正在处理的值的一种方法是使用查询的 ColumnList 来形成一个表达式:
`\{(#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>
(由于这是一个标准替换,没有必要用反斜杠转义大括号;它们在这里没有特殊含义。)
使用该reMatch(reg_expression, string_to_search)
功能。
Coldfusion 10 中的正则表达式的详细信息在这里。(我相信 CF8 中的正则表达式大致相同。)
使用以下代码。
<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#">
这将返回一个包含以下条目的数组。
CF 正则表达式中的[]
括号定义一个字符集来匹配单个字符。您+
在方括号后放置一个或多个字符,以匹配[]
. 例如,要匹配一个或多个大写字母,您可以编写[A-Z]+
.
如上面链接所述,CF 定义了匹配各种字符的快捷方式。我在代码中使用的是:\w
匹配字母数字字符或下划线,\s
匹配空白字符(包括空格、制表符、换行符等)。
要匹配以下特殊字符+*?.[^$({|\
,您可以通过在它们前面写反斜杠来转义\
它们。
破折号是一个例外-
,它不能用反斜杠转义。因此,要将其用作文字,只需将其放在字符集的最后,就像我在上面所做的那样。
例如,使用上面的正则表达式,您可以从以下字符串中提取字符。
<cfset str = "Hi my name is { John Galt}. And I live in {St. Peters-burg } my email address is {john@exam_ple.com}.">
结果将是一个包含以下条目的数组。
可能有更好的方法来做到这一点,但使用类似的东西rematch( '{.*?}', yourstring )
会给你所有匹配的数组。
为了将来参考,我使用出色的RegExr进行了此操作,这是一个非常好的在线正则表达式检查器。完全披露,它不是专门针对 ColdFusion 的,但它是测试事物的好方法。