1

我收到以下错误(当我在我的正则表达式中查看后面并向前看时它们不会出现 - 但是即使我在正则表达式的开头执行 (?m) 它也不会执行多行和全局) :

<!---
Detail: Reason: Sequence (?<...) not recognized.

Message: Malformed regular expression ""(.*)?(https?://)?(?<!@)(www.)?(example.com)(?=/)(.+)?"".

RAW_TRACE    coldfusion.runtime.StringFunc$MalformedRegularExpressionException: Malformed regular expression ""(.*)?(https?://)?(?<!@)(www.)?(example.com)(?=/)(.+)?"".

LINE     54
RAW_TRACE    at ...\file.cfm:54) --->

<!--- initialize a variable --->
<cfset stuff='<p><img alt="" src="/images/dsfsdfsd/all7color.jpg"</p>
  <br><a href="http://example.com/balsdjf.cfm">    
  <p><img alt="" src="/images/efwrer3fedf/all7color.jpg"</p>
  <br><a href="http://example.com/balsdjf.cfm">
'>

<cfscript>    
item=REReplace(stuff, 
               '"(.*)?(https?:\/\/)?(?<!\@)(www\.)?(example.com)(?=\/)\/(.+)?"', 
               '"/5"', 
               'ALL');    
</cfscript>    

<cfoutput>
  #item#
</cfoutput>
4

1 回答 1

4

如前所述,您收到错误是因为您使用的是后视功能,而 CFML 的正则表达式引擎(恐怕是Apache ORO )不支持它们。

如果你想使用look-behinds,你可以使用Java 的正则表达式引擎。如果有帮助,我已经开始在我的博客上写下如何通过 CFML 使用 Java 正则表达式。我还没有讨论过正则表达式模式语法,但我确实涵盖了从 CFML 调用 Java,并且模式语法在 Oracle 文档中有详细记录,并从文章链接到。

@m.buettner 也是完全正确的:“多行”标志“(?m)”,顺便说一句,无论如何都不会影响你的情况,因为它所做的只是改变方式^并被$解释,但你没有^$在你的模式中。

要使用 CFML 正则表达式替换操作来实现“全局”标志,您需要指定"all"范围参数,就像您已经拥有的那样。

我认为这回答了您的问题,但我认为您要问的内容/原因可能需要重新考虑。除了不支持后视功能之外,您正在尝试做的事情实际上是什么不起作用?

于 2013-04-17T20:56:59.067 回答