2015-09-07 3 views
3

У меня есть вопрос, который задал раньше в this link, но нет правильного ответа по ссылке. У меня есть текст запроса sql, и я хочу получить имена всех функций (все имя, содержащее схему), которые были созданы в них. моя строка может выглядеть так:соответствует необязательным специальным символам

create function [SN].[FunctionName] test1 test1 ... 
create function SN.FunctionName test2 test2 ... 
create function functionName test3 test3 ... 

, и я хочу, чтобы получить как [SN] [FunctionName] и SN.FunctionName, Я попытался это регулярное выражение:.

create function (.*?\]\.\[.*?\]) 

но это возвращает только первый оператор, как я могу сделать эти скобки необязательными в выражении регулярных выражений?

+0

Вы не хотите получать также 'functionName'? –

+0

да, я хочу, и я буду использовать '()', чтобы захватить его –

+0

Тогда, пожалуйста, проверьте мой ответ. Тот, который вы приняли, имеет по крайней мере 1 серьезную проблему в примере кода и не позволяет имя без периодов и квадратных скобок. –

ответ

1

Это один работает для меня:

create function\s+\[?\w+\]?\.\[?\w+\]? 

val regExp = "create function" + //required string literal 
    "\s+" + //allow to have several spaces before the function name 
    "\[?" + // '[' is special character, so we quote it and make it optional using - '?' 
    "\w+" + // only letters or digits for the function name 
    "\]?" + // optional close bracket 
    "\." + // require to have point, quote it with '\' because it is a special character 
    "\[?" + //the same as before for the second function name 
    "\w+" + 
    "\]?" 

См тестовый пример: http://regexr.com/3bo0e

+0

Этот код не будет работать корректно на C#. –

1

Чтобы сделать некоторый подшаблон необязательным, вам необходимо использовать квантор ?, который соответствует 1 или 0 вхождениям предыдущего подшаблона.

В вашем случае, вы можете использовать

create[ ]function[ ](?<name>\[?[^\]\s.]*\]?\.\[?[^\]\s.]*\]?) 
          ^  ^^  ^

Регулярное выражение соответствует строке, начиная с create function, а затем соответствия:

var rx = new Regex(@"create[ ]function[ ] 
      (?<name>\[?  # optional opening square bracket 
       [^\]\s.]*  # 0 or more characters other than `.`, whitespace, or `]` 
       \]?    # optional closing square bracket 
       \.    # a literal `.` 
       \[?    # optional opening square bracket 
       [^\]\s.]*  # 0 or more characters other than `.`, whitespace, or `]` 
       \]?   # optional closing square bracket 
      )", RegexOptions.IgnorePatternWhitespace); 

См demo

enter image description here

1

Вы можете использовать lookarounds:

(?<=create function)(\s*\S+\..*?)(?=\s) 

Demo on regex101.com

Он захватывает все между create function буквальным следуют один или более пробелов и другое пространство, если предположить, что Соответствующая строка содержит по крайней мере один точечный символ.

Смежные вопросы