У меня есть регулярное выражение:
(?i)^(?!.*\bWITH\b).*\(\s*.*\s*\b(INDEX|FASTFIRSTROW|HOLDLOCK|SERIALIZABLE|REPEATABLEREAD|READCOMMITTED|READUNCOMMITTED|ROWLOCK|PAGLOCK|TABLOCK|TABLOCKX|NOLOCK|UPDLOCK|XLOCK|READPAST)\b\s*.*\s*\)
Он возвращает true в http://regexstorm.net.
Но когда я запускаю на С#, он всегда возвращает false.
Строковый ввод в текст:
INNER JOIN t_hat_meisaimidasi AS MM (READCOMMITTED, NOLOCK) WHERE ( AND hat_kanri_no = ?
Может кто-нибудь объяснить мне, почему?
Я собираюсь пойти дальше и попросить людей перестать высказывать мнение о том, на каком языке человек программировать; это не имеет отношения к вопросу, и выбор никоим образом не влияет на вопрос. Продолжая и продолжая об этом, идет тонкая грань приличия.





Возвращает true для меня; вероятно, вы не использовали @"...", поэтому жетоны побега (\b и т. д.) не то, что вы думаете:
Console.WriteLine(Regex.IsMatch(
@"INNER JOIN t_hat_meisaimidasi AS MM (READCOMMITTED, NOLOCK) WHERE ( AND hat_kanri_no = ?",
@"(?i)^(?!.*\bWITH\b).*\(\s*.*\s*\b(INDEX|FASTFIRSTROW|HOLDLOCK|SERIALIZABLE|REPEATABLEREAD|READCOMMITTED|READUNCOMMITTED|ROWLOCK|PAGLOCK|TABLOCK|TABLOCKX|NOLOCK|UPDLOCK|XLOCK|READPAST)\b\s*.*\s*\)"));
Примечание. "\b" — это строка длины 1, содержащая символ возврата на одну позицию; @"\b" — это строка длины 2, содержащая косую черту и букву b. При работе с регулярным выражением вы почти всегда хотите использовать дословный строковый литерал (@"...").
Чтобы сделать его еще лучше: Visual Studio будет использовать раскрашивание, чтобы сообщить вам, когда вы все делаете правильно:
На мгновение задумаемся: Пакет DacFx включает в себя полнофункциональный анализатор T-SQL (
Microsoft.SqlServer.TransactSql.ScriptDom.TSqlParser). В долгосрочной перспективе это может оказаться более полезным, чем возиться с регулярными выражениями.