代码之家  ›  专栏  ›  技术社区  ›  Ryan Guill

ColdFusion OR条件下的正则表达式匹配

  •  1
  • Ryan Guill  · 技术社区  · 17 年前

    我正在尝试编写一个CF组件,该组件将解析 wikiCreole 文本。不过,我很难用我的一些正则表达式找到正确的匹配项。我觉得如果我能理解第一个,其余的就会点击。以下是一个示例:

    以下是示例输入:

    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.
    

    有什么想法吗?

    5 回复  |  直到 17 年前
        1
  •  6
  •   Michael Carman    17 年前

    [...] 表示一个字符类,因此:

    [(\*\*)|(\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")
    
        2
  •  1
  •   Goyuix    17 年前

    你真的应该改变你的

    (.*?) 
    

    类似于

    [^*]*?
    

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

        3
  •  1
  •   Vikdor    13 年前

    我知道这是一个老问题,但在回答Ryan Guill的问题时,他说:“我试过1美元,但它在里面放了一个字面意义上的1美元,而不是匹配的”,你应该使用ColdFusion \1 而不是 $1

        4
  •  0
  •   Kieveli    17 年前

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

    尝试使用“ '而不是1-替换方式略有不同。..但我认为模式是你工作所需要的。

    接近这个:

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

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

    好的,首先检查 //大胆// 那么// 粗体 //那么 粗体 那么 //大胆//

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

        5
  •  0
  •   Ryan McIlmoyl    17 年前

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