【问题标题】:Regex matching in ColdFusion OR conditionColdFusion OR 条件中的正则表达式匹配
【发布时间】:2009-06-01 18:41:59
【问题描述】:

我正在尝试编写一个解析wikiCreole 文本的CF 组件。不过,我无法使用我的一些正则表达式获得正确的匹配。我觉得如果我能把头绕到第一个周围,其余的就会点击。这是一个例子:

以下是输入示例:

You can make things **bold** or //italic// or **//both//** or //**both**//.

Character formatting extends across line breaks: **bold,
this is still bold. This line deliberately does not end in star-star.

Not bold. Character formatting does not cross paragraph boundaries.

我的第一次尝试是:

<cfset out = REreplace(out, "\*\*(.*?)\*\*", "<strong>\1</strong>", "all") />

然后我意识到它不会匹配没有给出**的地方,它应该在有两个回车的地方结束。

所以我尝试了这个:

<cfset out = REreplace(out, "\*\*(.*?)[(\*\*)|(\r\n\r\n)]", "<strong>\1</strong>", "all") />

它很接近,但由于某种原因它给了你这个:

You can make things <strong>bold</strong>* or //italic// or <strong>//both//</strong>* or //<strong>both</strong>*//.

Character formatting extends across line breaks: <strong>bold,</strong>
this is still bold. This line deliberately does not end in star-star.

Not bold. Character formatting does not cross paragraph boundaries.

有什么想法吗?

PS:如果有人对更好的标签或这篇文章的更好标题有任何建议,我会全力以赴。

【问题讨论】:

    标签: regex parsing coldfusion wiki


    【解决方案1】:

    [...] 代表一个字符类,所以:

    [(\*\*)|(\r\n\r\n)]
    

    实际上与此相同:

    [*|\r\n]
    

    即它匹配单个“*”和“|”不是替代品。

    另一个问题是你替换了双换行符。即使您的匹配成功,您最终也会合并段落。您首先需要恢复它或不使用它。我会使用积极的前瞻性来做后者。

    在 Perl 中我会这样写:

    $string =~ s/\*\*(.*?)(?:\*\*|(?=\n\n))/<strong>$1<\/strong>/sg;
    

    大胆猜测,ColdFusion 大概是这样的:

    REreplace(out, "\*\*(.*?)(?:\*\*|(?=\r\n\r\n))", "<strong>\1</strong>", "all")
    

    【讨论】:

    • 这似乎根本不匹配任何东西,但我明白你所说的 [] 只匹配一个字符。我不确定 : 在做什么,CF 中的语法是否可能不同?
    • (?:...) 是非捕获分组。它限制了文字“**”和“\n\n”之间的交替。据我所知,唯一的语法差异(此处)是 CF 中的“。”匹配 Perl 中默认不匹配的换行符。
    • 好吧,我把它改成这样:**([^*]*?)(?:**|(?=\r\n)) 它开始工作,除了我认为需要更改,只寻找双回车。连续两个是一个新的段落。那会是:**([^*]*?)(?:**|(?=(\r\n){2})) 对吗?
    • 基本上,是的,虽然我会使用 "\r\n\r\n" 或 "(?:\r\n){2}" 代替。 "(\r\n){2}" 将捕获。显然,在 ColdFusion 中,“\n”只是一个换行符,而不是一个半神奇的平台中立换行符。我已经更新了答案以反映这一点。
    【解决方案2】:

    你真的应该改变你的

    (.*?) 
    

    类似

    [^*]*?
    

    匹配除 * 之外的任何字符。我不知道这是否是问题,但它可能是 any-character 。正在吃你的一颗星星。当尝试平衡匹配字符(如双星或 html 开始/结束标记)以明确将它们从内部文本的匹配集中排除时,这也是一种普遍接受的“最佳实践”。

    *免责声明,我没有在 ColdFusion 中对正则表达式引擎的细微差别进行测试 - 但这个想法应该是正确的。

    【讨论】:

    • 谢谢。这似乎工作得更好一些。这也匹配回车吗?如果是这样,有没有办法排除它?
    • A * B”会失败,应该用“A * B”替换。
    【解决方案3】:

    我知道这是一个较老的问题,但在回应 Ryan Guill 所说的“我尝试了 $1 但它在其中放置了文字 $1 而不是匹配项”时,对于 ColdFusion,您应该使用 \1 而不是 $1

    【讨论】:

      【解决方案4】:

      我总是使用regex web-page。每次使用正则表达式时,我似乎都是从头开始。

      尝试使用 '$1' 而不是 \1 来代替这个 - 替换略有不同...但我认为该模式是您开始工作所需要的。

      更进一步:

      **(.?)**|//(.?)//

      棘手的部分是 //** 或 **//

      好的,首先检查 //bold// 然后 //bold// 然后 bold,然后 //粗体//

      **//(.?)//**|//**(.?)**//|**(.?)**|// (.?)//

      【讨论】:

      • 谢谢。我正在使用这样的测试页面,我似乎无法找到正确的正则表达式来做我想做的事情。
      • 我尝试了 $1 但它在其中放了一个文字 $1 而不是匹配项。
      【解决方案5】:

      当我使用正则表达式做任何事情时,我发现这个应用程序非常有用: http://www.gskinner.com/RegExr/desktop/ 仍然对您的实际问题没有帮助,但在未来可能会有用。

      【讨论】:

        猜你喜欢
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多