Я использую сборку CLR
для сопоставления шаблонов RegEx
в SQL. Сборка у меня очень простая. Я считаю, что шаблон, который я пытаюсь найти ошибочные данные, не допускает периодов. Однако данные, содержащие периоды в нем, не возвращаются CLR-based UDF
.RegEx Соответствие шаблону позволяет использовать период
Я знаю, что одно решение найти неверные данные может состоять в обновлении шаблона, однако шаблоны из сторонней XML-схемы и, следовательно, я не могу изменить шаблон, который я использую.
Я использую http://regexr.com/ как средство для проверки того, какие символы должны и не должны подбираться по шаблону. В приведенном ниже сценарии символ периода недействителен по шаблону при использовании веб-сайта.
Я что-то упустил с моей реализацией?
Строка данных:TEST. DATA
Pattern подкрепляются:'([A-Za-z] ?)*[A-Za-z]'
RegEx CLR Класс Метод:
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static bool RegExMatch(string pattern, string matchString)
{
if (string.IsNullOrEmpty(matchString) || string.IsNullOrEmpty(pattern))
return false;
Regex r1 = new Regex(pattern.TrimEnd(null));
return r1.Match(matchString.TrimEnd(null)).Success;
}
Te улица SQL код:
SELECT 'TEST. DATA' AS TEST_STRING
, dbo.RegExMatch('([A-Za-z] ?)*[A-Za-z]', 'TEST. DATA') AS PatternMatch
Этот шаблон действительно только утверждает, что текст ввода заканчивается буквенным символом. Если вы поместите '... a' на сайт, он покажет успешное совпадение. Если вы не можете обновить шаблон Regex, я не уверен, что предложить. Добавление привязок к шаблону помогло бы, с некоторым нюансом вокруг того, выполняете ли вы многострочное сопоставление.'^ [A-Za-z] * [A-Za-z] $' – Jay
Если вы получаете пользовательские регулярные выражения и хотите совместить * целую строку *, вам необходимо обернуть их не только привязками, но и внешними группировка. Попробуйте 'dbo.RegExMatch (CONCAT ('^ (?:', '([A-Za-z]?) * [A-Za-z]', ') $'), 'TEST. DATA')'. Если регулярное выражение содержит оператор чередования, в противном случае оно будет разрушено. –
Свойство [Success] (https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.group.success (v = vs.110) .aspx) возвращает true, если оно найдено и, согласно [this] (https://regex101.com/r/7dXE9j/1), у вас есть 2 матча. Трудно сказать, как обойти это, учитывая, что вы не можете изменить шаблон. Я думаю, вам нужно более точно определить, что именно вы «проверяете», поскольку шаблон регулярного выражения третьей стороны, которому вы передаете, недостаточно, чтобы просто сопоставлять его для проверки подлинности/ложности. – Quantic