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

Regex ColdFusion或条件下的正则表达式匹配,regex,parsing,coldfusion,wiki,Regex,Parsing,Coldfusion,Wiki,我正在尝试编写一个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

我正在尝试编写一个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.
您可以将内容加粗*或//italic//或//strong>//两者//*或//两者*//。
字符格式跨换行符扩展:粗体,
这仍然是大胆的。这一行故意不以星号结尾。
不大胆。字符格式不跨越段落边界。
有什么想法吗

附言:如果有人对更好的标签或更好的标题有任何建议,我会洗耳恭听

我总是用一个。似乎每次我使用正则表达式都是从零开始的

尝试使用“$1”而不是\1进行此操作-替换略有不同。。。但我认为这种模式是你工作所需要的

与此越来越接近:

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

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

好的,首先检查//bold// 然后//加粗//然后加粗,然后 //大胆的//

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

我总是使用一种新方法。似乎每次我使用正则表达式都是从零开始的

尝试使用“$1”而不是\1进行此操作-替换略有不同。。。但我认为这种模式是你工作所需要的

与此越来越接近:

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

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

好的,首先检查//bold// 然后//加粗//然后加粗,然后 //大胆的//

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


你真的应该改变你的想法

(.*?) 
差不多

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


*免责声明,我没有在ColdFusion中测试regex引擎的细微差别,但这个想法应该是正确的。

你真的应该改变你的想法

(.*?) 
差不多

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


*免责声明,我没有在ColdFusion中测试regex引擎的细微差别,但这个想法应该是正确的。

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

[(\*\*)|(\r\n\r\n)]
实际上与此相同:

[*|\r\n]
i、 e.它与单个“*”匹配,“|”不是替代项

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

在Perl中,我会这样写:

$string =~ s/\*\*(.*?)(?:\*\*|(?=\n\n))/<strong>$1<\/strong>/sg;
$string=~s/\*\*(.*?(:\*\*)(?=\n\n))/$1/sg;
大胆猜测一下,ColdFusion可能是这样的:

REreplace(out, "\*\*(.*?)(?:\*\*|(?=\r\n\r\n))", "<strong>\1</strong>", "all")
重新替换(out,“\*\*(.*?(:\*\*(?=\r\n\r\n))”,“\1,“全部”)

表示字符类的
[…]
,因此:

[(\*\*)|(\r\n\r\n)]
实际上与此相同:

[*|\r\n]
i、 e.它与单个“*”匹配,“|”不是替代项

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

在Perl中,我会这样写:

$string =~ s/\*\*(.*?)(?:\*\*|(?=\n\n))/<strong>$1<\/strong>/sg;
$string=~s/\*\*(.*?(:\*\*)(?=\n\n))/$1/sg;
大胆猜测一下,ColdFusion可能是这样的:

REreplace(out, "\*\*(.*?)(?:\*\*|(?=\r\n\r\n))", "<strong>\1</strong>", "all")
重新替换(out,“\*\*(.*?(:\*\*(?=\r\n\r\n))”,“\1,“全部”)

当我使用regex做任何事情时,我发现这个应用程序非常有用:
仍然无法解决您的实际问题,但可能会对您有所帮助。

当我使用regex执行任何操作时,我发现此应用程序非常有用:
这对你的实际问题仍然没有帮助,但可能会有帮助。

我知道这是一个较老的问题,但在回答Ryan Guill的问题时,他说:“我试了$1,但它在里面放了一个字面上的$1,而不是匹配。”对于ColdFusion,您应该使用
\1
而不是
$1
我知道这是一个较老的问题,但在回答Ryan Guill说的“我尝试了$1,但它在其中放入了文字$1而不是匹配项”时,对于ColdFusion,您应该使用
\1
而不是
$1
谢谢。我正在使用这样的测试页面,我似乎找不到合适的正则表达式来执行我正在尝试执行的操作。我尝试了$1,但它在其中放入了文字$1,而不是匹配项。谢谢。我正在使用这样一个测试页面,我似乎找不到合适的正则表达式来执行我正在尝试执行的操作。我尝试了$1,但它在其中放入了文字$1,而不是匹配。谢谢。这似乎确实起到了更好的作用。不过,这是否也与回车符?如果是这样的话,有没有一种方法可以排除这种情况?对于“a*B”来说,这将是失败的,而“a*B”应该(大概)被“a*B”所取代。谢谢。