【问题标题】:Negative lookahead in Regex to exclude two words正则表达式中的负前瞻以排除两个单词
【发布时间】:2020-12-10 00:06:38
【问题描述】:

我有以下正则表达式:

(?!SELECT|FROM|WHERE|AND|OR|AS|[0-9])(?<= |^|\()([a-zA-Z0-9_]+)

我正在匹配这样的字符串:

SELECT Static AS My_alias FROM Table WHERE Id = 400 AND Name = 'Something';

这已经完成了我想要的 90%。我还喜欢做的是排除AS My_alias,其中别名可以是任何单词。

我尝试将其添加到我的正则表达式中,但这不起作用:

(?!SELECT|FROM|WHERE|AND|OR|AS [a-zA-Z0-9_]+|[0-9])(?<= |^|\()([a-zA-Z0-9_]+)
                            ^^^^^^^^^^^^^^^^
                          this is the new part

如何使用我的正则表达式排除这部分字符串?

正则表达式的演示可以找到here

【问题讨论】:

  • 你不能使用sql parser
  • 至于正则表达式,我想你可以使用\b(?&lt;!\bAS\s+)(?!(?:SELECT|FROM|WHERE|AND|OR|AS)\b)(?&lt;=[ ^(])[A-Za-z_]\w*
  • 我同意上述建议。即使我们为您当前的正则表达式提供补丁,它仍然非常简单,并且对于许多其他类型的查询会失败。在此处编写/使用解析器以获得最佳结果。

标签: c# .net regex regex-lookarounds


【解决方案1】:

这不包括AS 并获得您寻找的令牌。它还处理多个选择值,包括零到多个 Where 子句。

想法是使用命名显式捕获,并让正则表达式引擎知道忽略任何未命名的捕获组。 (匹配但不捕获特征

我们还将把所有想要的“令牌”放入一个令牌捕获 (?&lt;Token&gt; ... ) 以满足我们所有的令牌需求。

var data = "SELECT Static AS My_alias FROM Table WHERE Id = 400 AND Name = 'Something';";

var pattern = @"
^
SELECT\s+
   (
     (?<Token>[^\s]+)
     (\sAS\s[^\s]+)?
     [\s,]+
   )+                  # One to many statements
FROM\s+
(?<Token>[^\s]+)       # Table name
(
  \s+WHERE\s+
   (
      (?<Token>[^\s]+)
      (.+?AND\s+)?
   )+                  # One to many conditions
)?                # Optional Where
";

var tokens = 
Regex.Matches(data, pattern, 
              RegexOptions.IgnorePatternWhitespace // Lets us space out/comment pattern
            | RegexOptions.ExplicitCapture)        // Only consume named groups.
     .OfType<Match>()
     .SelectMany(mt => mt.Groups["Token"].Captures // Get the captures inserted into `Token`
                                         .OfType<Capture>()
                                         .Select(cp => cp.Value.ToString()))
     ;

tokens 是这些字符串的数组:{ "Static", "Table", "Id", "Name" }


这应该可以让您继续了解大多数情况。如果您需要使用连接处理选择,请使用类似的逻辑;不管这是一个很好的工作基础。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多