我正在开发一个小应用,我需要删除开始和结束的标签,并且我在表达正确方面遇到了一些麻烦。
目前我有这段代码。问题出在第二个输出上,没有显示任何内容。
<cfcontent reset="true"/>
<cfset myStr = '<br> <br> <br> <br> This is a great Test<br> do you like my test? <br><br><br>'>
<cfoutput>#myStr#</cfoutput>
<cfset myNewString = REReplaceNoCase(myStr, '(^<.*?>+)|(<.*?>+$)', '' ,'ALL')>
<cfoutput>New: #myNewString#</cfoutput>
答案 0 :(得分:1)
以下正则表达式对我有用:
(^<[^>]*?>+)|(<[^>]*?>+$)
如果这是您想要的,那么它删除了第一个和最后一个标记。
但是,结束尖括号后的+
表示您可能打算在开头或结尾删除所有标记;虽然在当前形式中它将匹配一个或多个闭合尖括号。您需要使用组来更改该行为:
(^(<[^>]*?>\s*)+)|((<[^>]*?>\s*)+$)
这将删除字符串开头或结尾的所有标记。
答案 1 :(得分:0)
首先抱歉:这不是答案,我还不能评论,但我还是决定给你2美分。我发现你的问题很有趣,并且对它进行了一些调查。
事实证明:
<cfset multipleMatches = REReplaceNoCase(myStr, '(<.*?>+)', '- Match -' ,'ALL')>
会按预期匹配代码,但是这样:
<cfset singleMatche = REReplaceNoCase(myStr, '(<.*?>+$)', '- Match -' ,'ALL')>
会突然变得超级贪心。
对我来说这看起来像个错误,但我不确定关于正则表达式我能够将错误与足够高级的功能区分开来,这正是为什么使用像Joey这样的否定字符类是我们最好的选择避免头部刮伤过多。