匹配可选的特殊字符

时间:2015-09-07 12:02:16

标签: c# regex

我之前在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 (.*?\]\.\[.*?\])

但这只返回第一个语句,如何在regex表达式中使这些括号可选?

3 个答案:

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

答案 2 :(得分:1)

您可以使用外观:

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

Demo on regex101.com

它捕获create function文字后跟一个或多个空格和另一个空格之间的所有内容,假设匹配的字符串包含至少一个点字符。