正则表达式#匹配模式并忽略引号中的匹配

时间:2013-01-07 21:05:04

标签: c# regex oracle

我希望能够在SQL语句中找到绑定变量(以冒号开头,然后有文本):

SELECT * 
FROM TABLE 
WHERE TABLE_UID = :TABUID AND TABLE_TEXT = :TEXT

我发现这个正则表达式可以找到绑定变量:

Regex reg = new Regex(":[\\w]*",
                      RegexOptions.Multiline & RegexOptions.IgnoreCase); 

foreach (Match m in reg.Matches(sql)) 
{
    bindVar.Add(m.Value); 
}

我无法弄清楚如何忽略引号中存在的潜在绑定变量:

SELECT * 
FROM TABLE 
WHERE TABLE_UID = :TABUID AND TABLE_TEXT = TO_DATE(:TEXT, 'hh:mi:ss')

:mi& :ss不应该匹配正则表达式。

3 个答案:

答案 0 :(得分:2)

关于使用正则表达式做你想做的事情的智慧,我有点不稳定,但如果我是你,我会

  • 制作输入字符串的副本
  • 在输入字符串中删除您不想要的内容(在本例中为引号内的内容)
  • 现在您不必担心引号中的内容

答案 1 :(得分:0)

使用单词边界\ b

\\b:[\\w]*

答案 2 :(得分:0)

这将匹配未用单引号括起来的任何内容:

(?<![\\S'])([^'\\s]+)(?![\\S'])

我不够精明,不知道如何将它与你已经拥有的东西结合起来。