我希望匹配一个字符串“Order By XXX”,其中XXX可以是任何字母,数字,句号,逗号,空格或方括号。但是,如果不括在圆括号中,我只想匹配它(一方的括号是好的,只要它不在两边)。所以它应该与“”中的斜体部分相匹配,因为它不应该匹配
中的任何内容应匹配(斜体匹配部分):
不应该匹配:
我有正则表达式字符串,用于按文字匹配订单:[ ]*order by [\w,.\[\] ]+
。但是,我在正确地进行前瞻/后期工作时遇到了一些麻烦。关于如何进行的任何建议?
答案 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排序”将由第一个或第二个捕获括号捕获。