2016-11-23 2 views
0

Я использую сборку 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 
+0

Этот шаблон действительно только утверждает, что текст ввода заканчивается буквенным символом. Если вы поместите '... a' на сайт, он покажет успешное совпадение. Если вы не можете обновить шаблон Regex, я не уверен, что предложить. Добавление привязок к шаблону помогло бы, с некоторым нюансом вокруг того, выполняете ли вы многострочное сопоставление.'^ [A-Za-z] * [A-Za-z] $' – Jay

+0

Если вы получаете пользовательские регулярные выражения и хотите совместить * целую строку *, вам необходимо обернуть их не только привязками, но и внешними группировка. Попробуйте 'dbo.RegExMatch (CONCAT ('^ (?:', '([A-Za-z]?) * [A-Za-z]', ') $'), 'TEST. DATA')'. Если регулярное выражение содержит оператор чередования, в противном случае оно будет разрушено. –

+0

Свойство [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

ответ

0

Вы упоминаете, что узоры из третьих сторон XML-схемы. Регулярный вкус очень похож на .NET, поэтому вполне возможно, что все они будут хорошо работать в .NET. Тем не менее, все шаблоны XML-схемы привязаны по умолчанию, что аромат регулярного выражения не поддерживает ^ и $ в качестве якорей начала и конца строки.

Это означает, что вам нужно добавить анкеры в регулярных выражениях вы проверить, ^/\A, чтобы соответствовать в начале строки, и $/\z, чтобы соответствовать конец строки (\z предпочтительнее).

Самый безопасный способ добавить эту опору, путем нанесения рисунка на ^(?: и )$.

+0

Включение тестового шаблона с тем, что вы описали, теперь терпит неудачу в 'TEST. Проверка правильности строки DATA, так что она работает. По вашему опыту, скажете ли вы, что ручное включение шаблона, как вы описываете, не изменяет фактического тестового теста, но делает его более подходящим для тестирования? – Russ

+0

Нет, эта внешняя группировка является допустимым подходом, также используемым при привязке регулярных выражений по умолчанию [атрибуты шаблона HTML5] (https://www.w3.org/TR/html5/forms.html#the-pattern- атрибут). –

0

Если образец предметов похож на ТЕСТ. DATA такой шаблон должен работать.

^([A-Za-z]+)(\.)?\s?([A-Za-z]+)$ 

В настоящее время шаблон должен начать с по крайней мере, 1 буквой с последующим 0 или 1 периодов с последующим 1 или более символов пробела, а затем 1 или более букв.

EDIT: просто прочитайте второй абзац своего вопроса и заметите, что вы не можете изменить шаблон.

+0

PS. Вы можете поменять местами $ for \ z, если вы не хотите сопоставлять символ новой строки в конце строки – WBuck

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