2010-10-28 52 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