匹配字符串与正则表达式,只要它没有括号括起来

时间:2012-06-14 14:04:03

标签: c# regex lookahead lookbehind

我希望匹配一个字符串“Order By XXX”,其中XXX可以是任何字母,数字,句号,逗号,空格或方括号。但是,如果括在圆括号中,我只想匹配它(一方的括号是好的,只要它不在两边)。所以它应该与“”中的斜体部分相匹配,因为它不应该匹配

中的任何内容

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

  • 从Y 订单中选择X
  • 选择y =(从C 按[ID] desc 选择前1名Z)

不应该匹配:

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

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

您可以使用这样的替换:

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

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