2010-10-28 51 views
1

我想在.Net中對正則表達式應用否定。這是行不通的。當字符串有效的姓氏時reg不應該匹配。對於無效的姓氏,它應該匹配。有效名稱只允許在1-40之間的文字,空格,單引號和長度。有人建議解析XML,我不想那樣做。我知道還有另外一種方法可以通過刪除reg ex中的否定字符來反轉代碼中的匹配條件。但我也不想那樣。我需要純粹的註冊前解決方案。Reg Ex negation不能在XML字符串中工作

這是我的代碼。這符合有效的姓氏。但我不想匹配。

string toBevalidated = @"<FirstName>SomeName</FirstName><LastName>Some</LastName><Address1>Addre1</Address1>"; 
     var regex = new Regex(@"<LastName>([^a-zA-Z'\s])|(.{41,})</LastName>"); 
     var match = regex.Match(toBevalidated); 

     // Check to see if a match was found 
     if (match.Success) 
     { 
      Console.WriteLine("Success"); 
     } 
     else 
     { 
      Console.WriteLine("Failed"); 
     } 

編輯: 這裏有困惑讓我舉一些例子說明什麼,我打算到。當姓氏是有效的時候reg ex不應該匹配。例如樣品下面不應與REG前

情況1

<FirstName>SomeName</FirstName><LastName>Brian</LastName><Address1>Addre1</Address1> 

案例2

<FirstName>SomeName</FirstName><LastName>O'neil</LastName><Address1>Addre1</Address1> 

情況下3

<FirstName>SomeName</FirstName><LastName>Peter John</LastName><Address1>Addre1</Address1> 

當最後一個名字是無效的,章恩宜匹配

情況下4

<FirstName>SomeName</FirstName><LastName>Brian123</LastName><Address1>Addre1</Address1> 

情況下5

<FirstName>SomeName</FirstName><LastName>#Brian</LastName><Address1>Addre1</Address1> 

情況下6

<FirstName>SomeName</FirstName><LastName>BrianBrianBrianBrianBrianBrianBrianBrianBrianBrian</LastName><Address1>Addre1</Address1> 

,如果您需要了解更多信息,請讓我知道

+3

*爲什麼*你不想解析XML?在XML上使用正則表達式是一個糟糕的主意 - 它非常脆弱。 – 2010-10-28 15:16:36

+0

爲什麼你不會繼續在你昨天問的問題是什麼改變了開始一個新的,http://stackoverflow.com/questions/4037631/reg-ex-negation/4037708#4037708 – 2010-10-28 15:19:49

+0

請閱讀http:// tinyurl.com/so-hints提供改善問題的方法。 – 2010-10-28 15:21:14

回答

1

這本來是有益的,如果你給出的這個,你就有望沒有表現的例子,但我嫌疑那是因爲你如果它是一個無效字符會只匹配無效字符,例如

<LastName>5</LastName> 

,將符合(我相信;我沒有檢查),但這不會:

<LastName>55</LastName> 

認爲你可以這樣做:

<LastName>(.*[^a-zA-Z'\s].*)|(.{41,})</LastName> 

確保有至少那裏有一個無效字符(或者有41個或更多字符)。但在這裏可能會出現一些不合適的情況。

編輯:明白了。替代運算符在將其作爲選項之前取全部爲,而不是前面的組。最後的正則表達式爲:

<LastName>((.*[^a-zA-Z'\s].*)|(.{41,}))</LastName> 

下面是一些示例代碼:

using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     string pattern = @"<LastName>((.*[^a-zA-Z'\s].*)|(.{41,}))</LastName>"; 
     Regex regex = new Regex(pattern); 

     string[] samples = { 
      "<FirstName>SomeName</FirstName><LastName>Brian</LastName><Address1>Addre1</Address1>", 
      "<FirstName>SomeName</FirstName><LastName>O'neil</LastName><Address1>Addre1</Address1>", 
      "<FirstName>SomeName</FirstName><LastName>Peter John</LastName><Address1>Addre1</Address1>", 
      "<FirstName>SomeName</FirstName><LastName>Brian123</LastName><Address1>Addre1</Address1>",     
      "<FirstName>SomeName</FirstName><LastName>#Brian</LastName><Address1>Addre1</Address1>", 
      "<FirstName>SomeName</FirstName><LastName>BrianBrianBrianBrianBrianBrianBrianBrianBrianBrian</LastName><Address1>Addre1</Address1>", 
     }; 

     foreach (var sample in samples) 
     { 
      bool valid = !regex.IsMatch(sample); 
      Console.WriteLine("Valid: {0} Text: {1}", valid, sample); 
     } 
    } 
} 
+0

我想你的REG前這樣(* [^ A-ZA-Z'\ S]。*)|({41})。但它也匹配有效的姓氏。字符串匹配我 SomeName布賴恩 Addre1。 – Amzath 2010-10-28 16:55:41

+0

@amz:當我回家時我會看看。 – 2010-10-28 17:00:39

+0

@amz:現在修復它 - 再看一次。 – 2010-10-28 17:36:20

0

嘗試重寫的正則表達式: <LastName>([a-zA-Z'\s]{0,41})</LastName> 並在其他代碼中使用否定:if (!match.success) ...

+0

你確定這個reg ex ex Some123? – Amzath 2010-10-28 15:22:42

+0

或'Ø&賴利'? – 2010-10-28 18:59:32

+0

不,它與這些表達式中的任何一個都不匹配,因爲它應該只匹配允許的表達式,其餘的必須通過編碼完成。 – jojonas 2010-10-28 19:13:44

0

好吧,

我無法得到它在一個通工作,但如果你在2次做到這一點我認爲它會工作,首先檢查了不正確的字符,並在您檢查長度的二傳,

Match m = Regex.Match(@"<FirstName>SomeName</FirstName><LastName>Some</LastName><Address1>Addre1</Address1>", "<LastName>(.*[^a-zA-Z'\\s].*)</LastName>"); 

m = Regex.Match(@"<FirstName>SomeName</FirstName><LastName>SomeSomSomeSomeSomeSomeSomeSomeSomeSomeeSomeSomeSomeSomeSomeSomeSome</LastName><Address1>Addre1</Address1>", "<LastName>[a-zA-Z'\\s]{41,}</LastName>"); 

我沒有檢查過您提供的所有案例,請檢查出來並讓我知道它是否有效。

謝謝Skeet的更正。 [^ a-zA-Z'\ s]。它確實需要。*之前和之後,它將不匹配包含特殊字符的名稱。

檢查長度的正則表達式模式的第二部分甚至匹配每件事情,這就是爲什麼它不起作用。

祝你好運。

+0

它正在工作。我會對更多的名字進行測試,並讓你知道。謝謝。 – Amzath 2010-10-28 17:01:51

+0

第二個表達式對超過40個字符串且包含spl的字符串不起作用。 charecters SomeSomeSomeSomeSomeSomeSomeSomeSomeSome# – Amzath 2010-10-28 17:12:53

+0

當然它不會單獨工作,你必須檢查特殊字符首先使用正則表達式第一,然後一旦在XML中的姓氏是所有有效,並且沒有特殊字符,然後你去,第二道和檢查長度使用第二個正則表達式。 – 2010-10-28 17:18:54