Reg Ex отрицание - PullRequest
       2

Reg Ex отрицание

0 голосов
/ 28 октября 2010

Я использую .Net. Я хочу сопоставить фамилию с символами, отличными от a-z, A-Z, пробел и одинарные кавычки, а длина символов не должна быть между 1-40 Строка, которая должна быть сопоставлена, выглядит как XML <FirstName>SomeName</FirstName><LastName>SomeLastName</LastName><Address1>Addre1</Address1>

Я написал выражение Regualr, но оно соответствует только [a-zA-Z '. \ s] {1,40} <LastName>[a-zA-Z'.\s]{1,40}</LastName> EDIT: тег LastName пропущен. Но я хочу получить отрицание этого выражения. Это возможно или я должен использовать другой подход?

Ответы [ 5 ]

1 голос
/ 28 октября 2010

Вы, кажется, хотите знать, как отрицать совпадение с образцом, не используя некоторую логику типа «не» в языке, но помещая ее в само сопоставление с образцом.

Если это то, что вы действительно имеете в виду, все, что вам нужно сделать, это конвертировать "regex" в "^(?:(?!regex).)*$".

Первое верно для любой строки, которая содержит "регулярное выражение", а второе верно для любой строки, которая не содержит "регулярное выражение".

Полагаю, если вы хотите помнить о многострочных входных строках, это должно быть "\A(?:(?!regex)(?s).)*\z", просто чтобы быть очень осторожным.

1 голос
/ 28 октября 2010

Вы можете иметь отрицательные классы персонажей.[^abc] соответствует любому символу, который НЕ a, b или c.В вашем случае вы можете захотеть [^a-zA-Z'.\s]{1,40}

Поскольку ваши данные находятся в тегах XML, вы, вероятно, захотите извлечь их сначала.XML и регулярные выражения не всегда хорошо сочетаются.


Если вам абсолютно необходимо иметь дело с тегами XML в регулярном выражении, вы можете попробовать что-то вроде этого:

<FirstName>([^a-zA-Z'.\s]{1,40})</FirstName><LastName>([^a-zA-Z'.\s]{1,40})</LastName>

Группа захвата1 будет именем, группа захвата 2 будет фамилией.


Неправильный исходный вопрос. Если вы хотите, чтобы строки соответствовали более 40 символов, длина должна быть {41,}, а не {1,40}.Это обеспечит совпадение только с строками длиной более 40 символов.

0 голосов
/ 28 октября 2010

[РЕДАКТИРОВАТЬ] - Удалены другие вещи. Вот кое-что, что работало для всех условий (включая пустые) в моих тестах, включая наличие XML в тестируемой строке.

/^(<LastName><\/LastName>)|(<LastName>.*[^a-zA-Z'\s]+.*<\/LastName>)|(<LastName>(.{41,})<\/LastName>)$/
0 голосов
/ 28 октября 2010

попробуйте этот шаблон

"<LastName>([^a-zA-Z'\s])|(.{41,})</LastName>"
0 голосов
/ 28 октября 2010

Символ отрицания - «^». Таким образом, ваше выражение будет выглядеть следующим образом:

[^a-zA-Z'\S]{1,40}.

Вот ссылка на сайт Microsoft об отрицании.

Наслаждайтесь

...