2014-10-01 6 views
0

Так у меня есть эта строка для ввода и регулярного выраженияНужна помощь Regex

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 Десятичного (20,

Так что мне нужно, чтобы это было, если равно затем запятая \ AS еще запятая \ AS

+0

Уточните пожалуйста. Я чувствую, что английский - это не тот язык, на котором вы очень хорошо говорите, и некоторые примеры результатов того, что вы подразумеваете под «но я хочу также посмотреть на знак равенства» = «», что значительно прояснит вашу проблему. – Jerry

ответ

1

Используйте предпросмотр утверждать, что совпавшие символы должны сопровождаться пробелом или концом строки якоря.

(@.*?)(?:,|AS)(?=\s|$) 

DEMO

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); 

IDEONE

+0

или если OP хочет получить результат «чище»: pattern = (@. *?) (?:, | AS) (? = \ S | $) Console.WriteLine (m.Groups [1] .Value); – Arie

+0

yep, захватив часть '@', поможет ему также получить первую часть. –

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; 
} 
0

Просто сделайте вложенным OR, например:

\s*(?<parameterdeclaration>@[^\s]+)\s*(.+)((=.+)\s*(,|\bAS\b)|,) 

Я также изменил parameterdeclaration включить полное имя переменной, поскольку я предполагал, что это то, что вы хотели.

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