2013-05-23 2 views
4

Я пробовал несколько вещей, не смог заставить его работать. Мне нужно исключить PO Boxes. Я думал, что мне просто пришлось обернуть его?! .. но он не работает. Есть предположения?Как сменить PO BOX - Regex

^((?i)[P|p]*(OST|ost)*\.*\s*[O|o|0]*(ffice|FFICE)*\.*\s*[B|b][O|o|0][X|x]\s*(\d.))*$ 

EDIT: Извините, это то, что я ищу.

Пример: когда ввод «P.O. BOX» или «Почтовое отделение», мне нужно, чтобы regex был ложным. Когда вход 7821 Test street, мне нужно, чтобы regex был правдой.

Я пытаюсь использовать его в проекте ASP.net MVC

/// <summary> 
/// Regex for street fields 
/// </summary> 
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple =  false)] 
public class StreetAddressAttribute : RegularExpressionAttribute, IClientValidatable 
{ 
/// <summary> 
/// Regular expression validation for street field 
/// </summary> 
public StreetAddressAttribute() 
    : base(@"^(?!(?i)[P|p]*(OST|ost)*\.*\s*[O|o|0]*(ffice|FFICE)*\.*\s*[B|b][O|o|0][X|x]\s*(\d.)*)$") 
{ 
} 

/// <summary> 
/// Client side validation 
/// </summary> 
/// <param name="metadata">Modelmetadata</param> 
/// <param name="context">ControllerContext</param> 
/// <returns>Client-side validation rules</returns> 
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
{ 
    yield return new ModelClientValidationRule { ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "streetaddress" }; 
} 
} 

Спасибо за вашу помощь

+2

Можете ли вы объяснить, в реальных условиях, что возможные значения вы хотите, чтобы соответствовать? –

+0

Вы хотите исключить все почтовые ящики или даже коробки APO (зарубежные американские военные)? – jle

+2

Я бы не использовал регулярное выражение (потому что это просто добавление новой проблемы). Я думаю, что более простая строка содержит любые поля «po», «p.o. box», «почтовый ящик» и т. Д. «Работает лучше. – Dai

ответ

4

Ваше регулярное выражение имеет так много проблем, я пытаюсь решить одну за другой

  1. В классе символов вам не нужен | в качестве ИЛИ. Каждый символ внутри добавляется в список разрешенных символов. Таким образом, [P|p] позволяет использовать три символа «P», «p» и «|».

    Правильный класс был бы [Pp]

  2. Вы используете встроенный модификатор (?i). Это делает следующие буквы несоответствующими. Так что [Pp] не нужно, просто p достаточно, чтобы соответствовать буквам «P» и «p».

    в том числе это первые два вопросы, которые мы можем изменить свое выражение

    ^(?!(?i)p*(ost)*\.*\s*[Oo0]*(ffice)*\.*\s*b[o0]x\s*(\d.)*)$ 
    
  3. Вы сделали все, кроме b[o0]x повторяемых 0 или более раз в * квантора. Я совершенно уверен, что это не то, что вы хотите, или вы хотите найти такие вещи, как «pppppppostostb0x»?

регулярное выражение, что является ложным, когда вход «PO BOX» или «Post Office» больше похож на это:

^(?i)(?!p\.?o\.?\sbox|post\soffice).*$ 

Это регулярное выражение будет соответствовать каждой строки (из-за .* в конец), за исключением строк, которые начинают как этот, как это:

  • PO Box
  • ро box
  • p.o. коробка
  • Почтовое отделение
  • ПОЧТАМТУ
+0

Спасибо, что убрали мое страшное регулярное выражение! – Ricka