所以我有输入和正则表达式的字符串
string regs = "CREATE PROCEDURE TTTTT.TTTTTTTTT @idVal INT = null, @idVal2 INT, @DecimalVal Decimal(20,2) = null, @NumberVal Numeric(20) = null, @StringVal VarChar(80) = NULL AS";
var result = Regex.Matches(regs, @"\s*(?<parameterdeclaration>@.*?)\s*(.*?=.*?)\s*(,|\bAS\b)", RegexOptions.IgnoreCase);
我希望按如下方式在数组中拆分:
@idVal INT = null,
@idVal2 INT,
@DecimalVal Decimal(20,2) = null,
@NumberVal Numeric(20) = null,
@StringVal VarChar(80) = NULL AS
我有这个正则表达式:
@"\s*(?<parameterdeclaration>@.*?)\s*([^(\d,\d)],|\bAS\b)"
可以正常工作,但我也想查看等号'='
现在我有了这个:
@"\s*(?<parameterdeclaration>@.*?)\s*(.*?=.*?)\s*(,|\bAS\b)"
但最终将这两者串在一起:@idVal2 INT, @DecimalVal Decimal(20,2) = null,
是否有人知道如何告诉它首先寻找'=',然后是逗号或 AS ,如果没有找到然后去逗号 我不能使用@符号作为结束指示符,因为该名称实际上仍然可以包含@符号
而且我不能说只是等于逗号或者只是逗号,因为那么这个字段将被切断@DecimalVal Decimal(20,
所以我需要它是if equals后跟逗号\ AS else逗号\ AS
答案 0 :(得分:1)
CREATE PROCEDURE TTTTT\.TTTTTTTTT\s*|,\s+
或
^(.*?)(?=@)|,\s+
尝试使用\n
替换。请参阅演示。
答案 1 :(得分:1)
使用前瞻来断言匹配的字符后面必须跟有行锚的空格或末尾。
(@.*?)(?:,|AS)(?=\s|$)
string regs = "CREATE PROCEDURE TTTTT.TTTTTTTTT @idVal INT = null, @idVal2 INT, @DecimalVal Decimal(20,2) = null, @NumberVal Numeric(20) = null, @StringVal VarChar(80) = NULL AS";
Regex rgx = new Regex(@"(@.*?)(?:,|AS)(?=\s|$)");
foreach (Match m in rgx.Matches(regs))
Console.WriteLine(m.Groups[0].Value);
答案 2 :(得分:0)
string input = "CREATE PROCEDURE TTTTT.TTTTTTTTT @idVal INT = null, @idVal2 INT, @DecimalVal Decimal(20,2) = null, @NumberVal Numeric(20) = null, @StringVal VarChar(80) = NULL AS";
string pattern = "@";
string[] substrings = Regex.Split(input, pattern);
bool skipfirst = false;
foreach (string match in substrings)
{
if (skipfirst) Console.WriteLine("'@{0}'", match);
skipfirst = true;
}
答案 3 :(得分:0)
只需做一个嵌套的OR,就像这样:
\s*(?<parameterdeclaration>@[^\s]+)\s*(.+)((=.+)\s*(,|\bAS\b)|,)
我还更改了参数声明以包含完整的变量名称,因为我认为这就是你想要的。