2011-06-15 180 views
9

我正在为ColdFusion代码编写解析器。我正在使用正则表达式(在C#中)来提取cfquery标记的名称datasource属性。用于匹配引号和单引号的正则表达式

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

它非常适用于像 <cfquery datasource="myDS"<cfquery datasource='myDS'

串但解析字符串时,像 <cfquery datasource="#GetSourceName('myDS')#"

显然它变得疯狂正则表达式的一部分(?:'|“)是原因。是否有一种方法在th时只匹配单引号第一场比赛是单引号?只有在第一场比赛是双引号时才匹配双引号?

在此先感谢!

回答

6

编辑:我觉得这应该在C#中工作,你只需要做一回参考:一回参考首场比赛\1

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

或许

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

比赛datasource="#GetSourceName('myDS')#"

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

1

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

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

这样做的另一种可能的方法是使用前瞻/后视,但这往往会变得混乱,并没有得到普遍支持。

+0

在我看来,你的表情在错误的地方有第二个*,应该是(“[^”] *“)|('[^'] *')...除非你的意图是匹配许多单个字符常量如'x''y''z'。 – 2014-12-27 20:01:51

+1

我认为你是对的。修正。这也不能处理逃脱的单引号或双引号,但问题和答案是如此古老,以至于我会让它不完整(尽管现在正确)。 – 2015-01-20 23:54:22

相关问题