用于匹配报价和单引号的正则表达式

时间:2011-06-15 20:43:24

标签: c# regex coldfusion

我正在为ColdFusion代码编写解析器。我正在使用正则表达式(在c#中)来提取cfquery标记的名称datasource属性。

目前正则表达式如下     <cfquery\s.*datasource\s*=\s*(?:'|")(.*)(?:'|")

它适用于类似字符串     <cfquery datasource="myDS" 要么     <cfquery datasource='myDS'

但解析字符串时会发疯     <cfquery datasource="#GetSourceName('myDS')#"

显然正则表达式的一部分(?:'|')是原因。当第一个匹配是单引号时,有没有办法只匹配单引号?当第一个匹配是a时,只匹配双引号双引号?

提前致谢!

3 个答案:

答案 0 :(得分:6)

编辑:我认为这应该适用于C#,你只需要做一个后向引用:

datasource\s*=\s*('|")(.*)(?:\1)

或者

datasource\s*=\s*('|")(.*)(?:$1)

datasource="#GetSourceName('myDS')#"与第一场与\1匹配的后方引用匹配。

当然,你不能忽略?:的第一个捕获组,但仍然有这项工作。此外,您可能需要设置lazy标记,以便不与其他"匹配

答案 1 :(得分:1)

如果可能的话,我建议使用两个不同的正则表达式,或者以不同的方式分割正则表达式。

对于单个正则表达式,考虑@Mike发布的问题, ("[^"]*")|('[^']*') 然后你可以解析引号。

另一种可能的方法是使用先行/后视,但这往往会变得混乱,并且不受普遍支持。

答案 2 :(得分:0)

试着看看这篇文章:

  

How can I match a quote-delimited string with a regex?

他们似乎正在处理同样的问题。