用于匹配引号和单引号的正则表达式
我正在为ColdFusion代码编写解析器。我正在使用正则表达式(在C#中)来提取cfquery标记的名称datasource属性。用于匹配引号和单引号的正则表达式
暂时的正则表达式如下 <cfquery\s.*datasource\s*=\s*(?:'|")(.*)(?:'|")
它非常适用于像 <cfquery datasource="myDS"
或 <cfquery datasource='myDS'
串但解析字符串时,像 <cfquery datasource="#GetSourceName('myDS')#"
显然它变得疯狂正则表达式的一部分(?:'|“)是原因。是否有一种方法在th时只匹配单引号第一场比赛是单引号?只有在第一场比赛是双引号时才匹配双引号?
在此先感谢!
编辑:我觉得这应该在C#中工作,你只需要做一回参考:一回参考首场比赛\1
datasource\s*=\s*('|")(.*)(?:\1)
或许
datasource\s*=\s*('|")(.*)(?:$1)
比赛datasource="#GetSourceName('myDS')#"
。
当然,你不能忽略第一个捕获组?:
,仍然有这项工作。此外,您可能需要设置lazy
标志,以便不与其他"
的
如果可能的话,我会建议使用两个不同的正则表达式,或者以不同的方式分割正则表达式。
对于单个正则表达式,考虑@Mike发布的问题, ("[^"]*")|('[^']*')
然后您可以解析出引号。
这样做的另一种可能的方法是使用前瞻/后视,但这往往会变得混乱,并没有得到普遍支持。
在我看来,你的表情在错误的地方有第二个*,应该是(“[^”] *“)|('[^'] *')...除非你的意图是匹配许多单个字符常量如'x''y''z'。 – 2014-12-27 20:01:51
我认为你是对的。修正。这也不能处理逃脱的单引号或双引号,但问题和答案是如此古老,以至于我会让它不完整(尽管现在正确)。 – 2015-01-20 23:54:22
感谢您的链接。它实际上也给我的问题提供了一个有效的答案。 – Jaepetto 2011-06-16 06:37:22
没问题。很高兴我能帮上忙。 – Swift 2011-06-16 22:02:33