我之前在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表达式中使这些括号可选?
答案 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
答案 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)
它捕获create function
文字后跟一个或多个空格和另一个空格之间的所有内容,假设匹配的字符串包含至少一个点字符。