2013-05-28 2 views
7

मेरे पास एक नियमित अभिव्यक्ति है कि मैं .NET डेटा एनोटेशन सत्यापन मॉडल के लिए पता लगाने की कोशिश कर रहा हूं जिसका मैं उपयोग कर रहा हूं। वर्तमान में यह इस.NET सी # डेटानोटेशन के लिए विशिष्ट .NET regex

[RegularExpression("^((?!City)[a-zA-Z '])+$", ErrorMessage = "City is required and must be properly formatted.")] 

इस regex की पहली छमाही शहर के लिए खाते में करने के लिए है की तरह लग रहा है, दूसरी छमाही यकीन है कि इसकी केवल अक्षर और रिक्त स्थान बनाने के लिए है।

इनपुट टेक्स्ट बॉक्स के लिए डिफ़ॉल्ट मान शहर है, इसलिए बस "शहर" सत्यापन पास नहीं कर सकता है। मुझे लगता है कि इन मामलों को पास करने के लिए मुझे उस रेगेक्स का पहला भाग नहीं मिल रहा है।

Cityville 
City City 
Jersey City 
Arizona City 

लेकिन इस मामले से पारित नहीं:

City 

किसी भी मदद की बहुत सराहना की जाएगी।

^(?! (^ सिटी $) [a-zA-जेड ']) + $

मैं के सभी अद्यतन:

* संपादित * यह एक चाल किया इसे शामिल करने के लिए मेरी मान्यता। बस अगर आप देखना चाहते हैं कि मैं क्या कर रहा हूं। यहां अगर पूरे सत्यापन डेटा मॉडल का कोड जो मैं उपयोग कर रहा हूं। (सही regex के साथ अद्यतन)

public class FormModel { 
    [Required(ErrorMessage = "First Name is a Required field.")] 
    [DataType(DataType.Text)] 
    [Display(Order = 1, Name = "FirstName")] 
    [RegularExpression("^((?!^First Name$)[a-zA-Z '])+$", ErrorMessage = "First name is required and must be properly formatted.")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Last Name is a Required field.")] 
    [DataType(DataType.Text)] 
    [Display(Order = 2, Name = "LastName")] 
    [RegularExpression("^((?!^Last Name$)[a-zA-Z '])+$", ErrorMessage = "Last name is required and must be properly formatted.")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage = "Address is a Required field.")] 
    [DataType(DataType.Text)] 
    [Display(Order = 3, Name = "Address")] 
    [RegularExpression("^((?!^Address$)[0-9A-Za-z #.,])+$", ErrorMessage = "Address is required and must be properly formatted.")] 
    public string Address { get; set; } 

    [DataType(DataType.Text)] 
    [Display(Order = 4, Name = "Address2")] 
    public string Address2 { get; set; } 

    [Required(ErrorMessage = "City is a Required field.")] 
    [DataType(DataType.Text)] 
    [RegularExpression("^((?!^City$)[a-zA-Z '])+$", ErrorMessage = "City is required and must be properly formatted.")] 
    [Display(Order = 6, Name = "City")] 
    public string City { get; set; } 

    [Required(ErrorMessage = "State is a Required field.")] 
[DataType(DataType.Text)] 
[Display(Order = 7, Name = "State")] 
public IEnumerable<String> State { get; set; } 

[Required(ErrorMessage = "Zip is a Required field.")] 
[DataType(DataType.Text)] 
[RegularExpression("\\d{5}", 
     ErrorMessage = "Zip Code is required and must be properly formatted.")] 
[Display(Order = 8, Name = "Zip")] 
public String Zip { get; set; } 

[Required(ErrorMessage = "Phone is a Required field.")] 
[DataType(DataType.PhoneNumber)] 
[RegularExpression("^[01]?[- .]?\\(?[2-9]\\d{2}\\)?[- .]?\\d{3}[- .]?\\d{4}$", 
     ErrorMessage = "Phone is required and must be properly formatted.")] 
[Display(Order = 9, Name = "Phone")] 
public string Phone { get; set; } 

[Required(ErrorMessage = "Email is a Required field.")] 
[DataType(DataType.EmailAddress)] 

[RegularExpression("^[A-Za-z0-9._%+-]*@[A-Za-z0-9.-]*\\.[A-Za-z0-9-]{2,}$", 
     ErrorMessage = "Email is required and must be properly formatted.")] 
[Display(Order = 10, Name = "Email")] 
public string Email { get; set; } 

उत्तर

2

इस नियमित अभिव्यक्ति के लिए आजमाएं - ^((?!^City$)[a-zA-Z '])+$
"शहर" के लिए एक नकारात्मक जांच करने के लिए, मैं एक शुरुआत (^) & अंत ($) पात्रों को शामिल किया है शहर के लिए मैंने इसे http://regex101.com/r/bF4bZ3 पर परीक्षण किया है और यदि मैं आवश्यकता को सही ढंग से समझ रहा हूं तो ऐसा लगता है।

+0

यह चाल है! धन्यवाद –

+0

@ChrisLimina यदि आपको अपनी समस्या हल हो गई है तो आपको इसे स्वीकृत उत्तर के रूप में चिह्नित करना चाहिए। – melwil

1

यह वास्तव में अपनी ओर से एक बहुत छोटी सी गलती है। करने के लिए अपने Regex बदलें:

^(?!^City$)[a-zA-Z ']+$ 

और आप वांछित प्रभाव होगा। असल में + का मतलब एक या अधिक बार होता है, और चूंकि आपके पास एक या अधिक बार होने वाली ब्रैकेट्स में संलग्न WHOLE अभिव्यक्ति थी, तो इसे स्ट्रिंग में किसी भी बिंदु पर "सिटी" मैच मिल जाएगा ... इसके बजाय, इसमें अंग्रेजी: नहीं "शहर", और अक्षरों और रिक्त स्थान या एकल उद्धरण एक या अधिक बार।

Regex परीक्षण करने के लिए एक अच्छा उपकरण Regex हीरो है: http://regexhero.net/tester

+1

यह 'सिटी सिटी 'से मेल नहीं खाता है। यह सुनिश्चित करने के लिए कि शहर के बाद कुछ भी नहीं है, आपको आगे देखने में '$ 'की आवश्यकता है। – juharr

+0

आप सही हैं। संशोधित। – Haney

1

(?!City) मतलब है City शून्य चौड़ाई नकारात्मक अग्रावलोकन, इसलिए, ^((?!City)[a-zA-Z '])+$ का अर्थ है:

  • केवल अक्षर रिक्त स्थान शामिल है और '
  • शामिल नहीं City

यहाँ है कैसे +०१२३४०९९७७२६ अस्वीकृत करने के लिए:

//Regular Expression  
//^(?!^\s*City\s*$)[a-zA-Z ']+$ 
//as a .Net string 
string str = "^(?!^\\s*City\\s*$)[a-zA-Z ']+$" 

Demo

1

नियमित अभिव्यक्तियों में नकारात्मक मिलान आमतौर पर एक बुरा विचार है, यह अभी इस तरह से डिज़ाइन नहीं किया गया है। सबसे अच्छा तरीका यह जांचना होगा:

"^City$" 

और परीक्षण को अस्वीकार करें। इस मामले में आपके पास वास्तव में ऐसा करने का विकल्प नहीं है।

आप वास्तव में करीब हैं, आपको केवल अपने एंकरों को नकारात्मक लुकहेड में स्थानांतरित करने की आवश्यकता है, और स्ट्रिंग को न्यूनतम लंबाई दें।

(?!^City$)[-a-zA-Z ]{4,} 

यह 4 वर्ण या उससे अधिक की किसी भी चीज़ से मेल खाएगा जो "शहर" नहीं है।

न्यूनतम लंबाई के बिना "शहर" में "ity" एक मैच होगा जो आपकी मदद नहीं करेगा।

यदि आप चाहें तो पीछे देखने के लिए आप न्यूनतम लंबाई को 3 तक कम कर सकते हैं।

(?!^City$)[-a-zA-Z ]{3,}(?<!^City$) 
1

अन्य उत्तरों ने आपको नियमित अभिव्यक्ति के साथ सहायता दी है। मैं थोड़ा अलग पहलू पर टिप्पणी करने जा रहा हूं - डिफ़ॉल्ट मान कुछ सार्थक होना चाहिए, या कुछ भी नहीं ("शहर" एक खराब डिफ़ॉल्ट मान है)।

जो आप संभवतः करना चाहते थे उसे प्लेसहोल्डर टेक्स्ट रखा गया था, जो टेक्स्टबॉक्स में प्रवेश करने के तुरंत बाद गायब हो जाता है। यदि आप नेट 4.5 का उपयोग कर रहे हैं तो आप PromptDisplay विशेषता के साथ ऐसा कर सकते हैं - विवरण के लिए this answer देखें।

नकली डिफ़ॉल्ट मान का उपयोग नहीं करना मतलब है कि आप केवल [Required] का उपयोग कर सकते हैं और उपयोगकर्ताओं को कुछ दर्ज करने की आवश्यकता होगी, और आपको अपने नकली डिफ़ॉल्ट मानों का ट्रैक रखने के लिए आवश्यक रोकना होगा।

बस कामों में एक और स्पैनर फेंकने के लिए, "सिटी" valid place name है - वेल्स में शहर और ज़्यूरिख में एक क्षेत्र नामक दो गांव हैं!

+0

अगर मेरे पास यह मेरा तरीका था तो मैं बस सब कुछ के लिए लेबल का उपयोग करता। दुर्भाग्य से रचनात्मक रूपों को ऐसे रूपों के साथ आना पसंद है जो मेरे फॉर्म सत्यापन को गड़बड़ कर देते हैं। मैं अंततः क्या करूँगा .NET डेटा एनोटेशन के विकल्प के रूप में इसका उपयोग करने का प्रयास करें। http://fluentvalidation.codeplex.com/ –