8

我正在寻找匹配字符串“Order By XXX”,其中 XXX 可以是任何字母、数字、句点、逗号、空格或方括号。但是,如果它没有被括号包围,我只想匹配它(一侧的括号是可以的,只要它不在两侧)。所以它应该匹配“”中的斜体部分,因为它不应该匹配任何东西

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

  • 从 Y顺序按 z选择 X
  • Select y = (select top 1 Z from C Order by [ID] desc )

不应该匹配:

  • 从 Y 中选择 X(按 z 排序)
  • Select aa, NTILE(4) OVER (Order by ab) group by ac

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

4

3 回答 3

1

试试这个:

(?<!\(\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>
于 2012-06-14T14:37:18.097 回答
0

这对我有用,让我知道是否还有其他我遗漏的情况:
Regex r = new Regex(@"[^(](order by [^)]+)", RegexOptions.IgnoreCase);

于 2012-06-14T14:28:20.990 回答
-1

你可以像这样使用交替:

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

“order by XXX”将被第一个或第二个捕获括号捕获。

于 2012-06-14T14:53:30.973 回答