8

XXX が任意の文字、数字、ピリオド、コンマ、スペース、または角括弧である「Order By XXX」という文字列に一致するものを探しています。ただし、括弧で囲まれていない場合にのみこれを一致させたいと思います(両側にない限り、片側の括弧は問題ありません)。したがって、「」のイタリック体の部分に一致する必要があります。

一致する必要があります (イタリック体の一致セクション):

  • Z 順で Y から X を選択
  • Select y = (C Order by [ID] descから上位 1 つの Z を選択)

一致しない:

  • Y から X を選択 (z 順)
  • aa, NTILE(4) OVER (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

This works for me, let me know if there are other cases I'm missing:
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., \[\]]+)\)

「XXXによる順序」は、最初または2番目のキャプチャー括弧によってキャプチャーされます。

于 2012-06-14T14:53:30.973 に答える