Другая причина использовать Схему для проверки против состоит в том, что, в то время как узлы XML явно заказаны, атрибуты XML не.
Так Ваше сравнение строк:
Assert.AreEqual(myDoc.OuterXML(),"big string of XML")
перестал бы работать, если атрибуты находятся в другом порядке, как это могло бы легко произойти, если бы один бит XML был вручную создан и другой программно.
К сожалению, если вы используете Linux, у вас не будет доступа к одному из лучших: Regex Buddy .
RegexBuddy - ваш идеальный вариант компаньон для работы с регулярными выражениями. С легкостью создавайте регулярные выражения, которые точно соответствуют вашим требованиям. Четко понимать сложные регулярные выражения, написанные другими. Быстро тестируйте любое регулярное выражение на образцах строк и файлов, предотвращая ошибки в реальных данных. Выполняйте отладку без догадок, выполняя фактический процесс сопоставления. Используйте регулярное выражение с фрагментами исходного кода, автоматически настраиваемыми в соответствии с особенностями вашего языка программирования. Собирайте и документируйте библиотеки регулярных выражений для повторного использования в будущем. GREP (поиск и замена) через файлы и папки. Интегрируйте RegexBuddy со своими любимыми инструментами поиска и редактирования для мгновенного доступа. (со своего веб-сайта)
Попробуйте YAPE :: Regex :: Explain для Perl:
#!/usr/bin/perl
use strict;
use warnings;
use YAPE::Regex::Explain;
print YAPE::Regex::Explain->new(
qr/^\A\w{2,5}0{2}\S \n?\z/i
)->explain;
Вывод:
The regular expression: (?i-msx:^\A\w{2,5}0{2}\S \n?\z) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?i-msx: group, but do not capture (case-insensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- ^ the beginning of the string ---------------------------------------------------------------------- \A the beginning of the string ---------------------------------------------------------------------- \w{2,5} word characters (a-z, A-Z, 0-9, _) (between 2 and 5 times (matching the most amount possible)) ---------------------------------------------------------------------- 0{2} '0' (2 times) ---------------------------------------------------------------------- \S non-whitespace (all but \n, \r, \t, \f, and " ") ---------------------------------------------------------------------- ' ' ---------------------------------------------------------------------- \n? '\n' (newline) (optional (matching the most amount possible)) ---------------------------------------------------------------------- \z the end of the string ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------
RegexPal - отличный бесплатный тестер регулярных выражений JavaScript. Поскольку он использует механизм регулярных выражений JavaScript, в нем нет некоторых более продвинутых функций регулярных выражений, но он довольно хорошо работает для многих регулярных выражений. Больше всего мне не хватает утверждений ретроспективного просмотра.
Большинство ошибок регулярных выражений делятся на три категории:
Незаметные пропуски - исключение ' ^
' в начале или ' $
'в конце, используя' *
', где вы должны были использовать' +
'- это просто ошибки новичков, но часто ошибочное регулярное выражение все еще передает все автоматизированные тесты.
Случайный успех - часть регулярного выражения совершенно неверна и обречена на провал в 99% случаев использования в реальном мире, но по чистой случайности ему удается пройти полдюжины автоматических тестов, которые вы написали .
Слишком большой успех - одна часть регулярного выражения соответствует намного большему количеству совпадений, чем вы думали. Например, токен [^.,] *
также будет соответствовать \ r
и \ n
, Это означает, что ваше регулярное выражение теперь может соответствовать нескольким строкам текста, даже если вы заключили его в ^
и $
.
На самом деле нет замены для правильного обучения регулярное выражение. Прочтите справочное руководство по вашему механизму регулярных выражений и используйте такой инструмент, как Regex Buddy, чтобы поэкспериментировать и ознакомиться со всеми функциями и особенно обратить внимание на любое особое или необычное поведение, которое они могут проявлять. Если вы изучите регулярное выражение правильно, вы избежите большинства ошибок, упомянутых выше, и вы будете знать, как написать небольшое количество автоматических тестов, которые могут гарантировать все крайние случаи без чрезмерного тестирования очевидных вещей (делает [ AZ]
действительно соответствует каждой букве между A и A? Я лучше напишу 26 вариантов модульного теста, чтобы убедиться!).
Отличной программой, которая поможет вам писать регулярные выражения, была бы Perl ; вы можете попробовать регулярное выражение, чтобы убедиться, что оно очень легко совпадает:
perl -e 'print "yes!\n" if "string" =~ /regex to test/'
См. этот вопрос SO о регулярных выражениях модульного тестирования для получения дополнительной информации о тестировании регулярных выражений в целом.
Вы можете попробовать использовать веб-сайты, которые дают вам подсказки и мгновенное удовлетворение, например этот . Создание простого Perl-скрипта, который вы можете легко изменить, также является отличным полигоном для тестирования. Примерно так:
#!/usr/bin/perl
$mystring = "My cat likes to eat tomatoes.";
$mystring =~ s/cat/dog/g;
print $mystring;
Также ознакомьтесь с прагмой re
, которая покажет, как компилируются регулярные выражения, а также как они выполняются:
$ perl -Mre=debugcolor -e '"huzza" =~ /^(hu)?z{1,2}za$/'
Вывод:
Compiling REx "^(hu)?z{1,2}za$" Final program: 1: BOL (2) 2: CURLYM[1] {0,1} (12) 6: EXACT (10) 10: SUCCEED (0) 11: NOTHING (12) 12: CURLY {1,2} (16) 14: EXACT (0) 16: EXACT (18) 18: EOL (19) 19: END (0) floating "zza"$ at 0..3 (checking floating) anchored(BOL) minlen 3 Guessing start of match in sv for REx "^(hu)?z{1,2}za$" against "huzza" Found floating substr "zza"$ at offset 2... Guessed: match at offset 0 Matching REx "^(hu)?z{1,2}za$" against "huzza" 0 | 1:BOL(2) 0 | 2:CURLYM[1] {0,1}(12) 0 | 6: EXACT (10) 2 | 10: SUCCEED(0) subpattern success... CURLYM now matched 1 times, len=2... CURLYM trying tail with matches=1... 2 | 12: CURLY {1,2}(16) EXACT can match 2 times out of 2... 3 | 16: EXACT (18) 5 | 18: EOL(19) 5 | 19: END(0) Match successful! Freeing REx: "^(hu)?z{1,2}za$"
Если вы собираетесь купить инструмент, Komodo от ActiveState - отличный редактор для языков сценариев, который поставляется с могучий прекрасный помощник по регулярным выражениям. Это кроссплатформенный, но не бесплатный. Это помогло мне выйти из нескольких трудных ситуаций, когда я не совсем понимал, почему что-то не анализировалось, и поддерживает несколько типов разновидностей регулярных выражений.
кроссплатформенный, но не бесплатный. Это помогло мне выйти из нескольких трудных ситуаций, когда я не совсем понимал, почему что-то не анализировалось, и поддерживает несколько типов разновидностей регулярных выражений. кроссплатформенный, но не бесплатный. Это помогло мне выйти из нескольких трудных ситуаций, когда я не совсем понимал, почему что-то не анализировалось, и поддерживает несколько типов разновидностей регулярных выражений.Если вы намерены просто дать другой Фон Границе. Вы можете добиться этого в ControlTemplate.
http://regex-test.com - действительно хороший / профессиональный веб-сайт, который позволяет вам тестировать множество различных типов регулярных выражений.