将字符串与正则表达式匹配,只要它没有被括号包围

本文关键字:包围 字符串 正则表达式 | 更新日期: 2023-09-27 18:37:05

我希望匹配一个字符串"按XXX排序",其中XXX可以是任何字母,数字,句点,逗号,空格或方括号。但是,我只想在它没有括号包围的情况下匹配它(一侧的括号是可以的,只要它不在两侧)。所以它应该匹配"中的斜体部分,它不应该匹配中的任何内容

应匹配(斜体匹配部分):

  • 从 Y 顺序中按 z 选择 X
  • 选择 y =(从 C 排序中选择前 1 个 Z 按 [ID] 说明)

不应匹配:

  • 从 Y 中选择 X(按 z 排序)
  • 选择 a.a
  • , NTILE(4) OVER (按 a.b 排序) 分组按 a.c

我有用于按文本匹配顺序的正则表达式字符串:[ ]*order by ['w,.'['] ]+ .但是,我在正确获得工作前瞻/背后的外观时遇到了一些麻烦。关于如何进行的任何建议?

将字符串与正则表达式匹配,只要它没有被括号包围

试试这个:

(?<!'('s*)order's+by's+['w,.'['] ]+(?<!'s*'))

在PowerShell中测试时:

PS> @(
    'Select X from Y order by z'
    'Select y = (select top 1 Z from C Order by [ID] desc)'
    'Select X from Y (order by z)'
    'Select a.a, NTILE(4) OVER (Order by a.b) group by a.c'
    'Order by 87'
    '(Order by 87)'
    '( Order by 87 )'
    '(Order by 87 )'
    '( Order by 87)'
    'Order by _foo'
) -match '(?<!'('s*)order's+by's+['w,.'['] ]+(?<!'s*'))'
Select X from Y order by z
Select y = (select top 1 Z from C Order by [ID] desc)
Order by 87
Order by _foo
PS>

这对我有用,如果还有其他我遗漏的情况,请告诉我:
Regex r = new Regex(@"[^(](order by [^)]+)", RegexOptions.IgnoreCase);

你可以像这样使用交替:

'(?(order by [a-z0-9., '[']]+)(?![a-z0-9., '[']])(?<!'))|[^(](order by [a-z0-9., '[']]+)')

"按XXX排序"将由第一个或第二个捕获括号捕获。