我正在为ColdFusion代码编写解析器。我正在使用正则表达式(在c#中)来提取cfquery标记的名称datasource属性。
目前正则表达式如下
<cfquery\s.*datasource\s*=\s*(?:'|")(.*)(?:'|")
它适用于类似字符串
<cfquery datasource="myDS"
要么
<cfquery datasource='myDS'
但解析字符串时会发疯
<cfquery datasource="#GetSourceName('myDS')#"
显然正则表达式的一部分(?:'|')是原因。当第一个匹配是单引号时,有没有办法只匹配单引号?当第一个匹配是a时,只匹配双引号双引号?
提前致谢!
答案 0 :(得分:6)
编辑:我认为这应该适用于C#,你只需要做一个后向引用:
datasource\s*=\s*('|")(.*)(?:\1)
或者
datasource\s*=\s*('|")(.*)(?:$1)
将datasource="#GetSourceName('myDS')#"
与第一场与\1
匹配的后方引用匹配。
当然,你不能忽略?:
的第一个捕获组,但仍然有这项工作。此外,您可能需要设置lazy
标记,以便不与其他"
匹配
答案 1 :(得分:1)
如果可能的话,我建议使用两个不同的正则表达式,或者以不同的方式分割正则表达式。
对于单个正则表达式,考虑@Mike发布的问题,
("[^"]*")|('[^']*')
然后你可以解析引号。
另一种可能的方法是使用先行/后视,但这往往会变得混乱,并且不受普遍支持。
答案 2 :(得分:0)