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

时间:2009-06-01 18:41:59

标签: regex parsing coldfusion wiki

我正在尝试编写一个解析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:如果有人对更好的标签有任何建议,或者对这篇文章有更好的标题,我全都耳朵。

5 个答案:

答案 0 :(得分:6)

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

[(\*\*)|(\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")

答案 1 :(得分:1)

你真的应该改变你的

(.*?) 

类似

[^*]*?

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

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

答案 2 :(得分:1)

我知道这是一个较老的问题,但是为了回应Ryan Guill所说的“我尝试了1美元,但是在那里放了1美元而不是匹配”对于ColdFusion,你应该使用\1代替{{ 1}}

答案 3 :(得分:0)

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

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

更接近这个:

  

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

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

  

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

     

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

答案 4 :(得分:0)

当我正在使用正则表达式执行任何操作时,我发现此应用程序非常有用: http://www.gskinner.com/RegExr/desktop/ 仍然无法解决您的实际问题,但可能会有用。