Regex c#匹配模式和忽略引号中的匹配

本文关键字:模式 Regex | 更新日期: 2023-09-27 17:50:59

我希望能够在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')

:小姐,:ss不能在正则表达式中匹配

Regex c#匹配模式和忽略引号中的匹配

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

  • 复制输入字符串
  • 去掉输入字符串中不想要的内容(在本例中是引号内的内容)
  • 现在你不必担心引号里的内容

使用文字边界'b

''b:[''w]*

这将匹配任何没有被单引号括起来的内容:

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

我还不够聪明,不知道如何把它和你已经有的东西结合起来。