Regex ColdFusion或条件下的正则表达式匹配
我正在尝试编写一个CF组件来解析文本。但是,我很难获得与某些正则表达式的正确匹配。我觉得如果我能把我的头放在第一个周围,其他的就会点击。以下是一个例子: 以下是示例输入: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
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”所取代。谢谢。