1

我正在尝试对.Net 中的正则表达式应用否定。这没用。当字符串具有有效的姓氏时,reg ex 不应匹配。对于无效的姓氏,它应该匹配。有效名称仅允许字符、空格、单引号和 1-40 之间的长度。有人建议解析 XML,我不想这样做。我知道还有另一种方法可以通过删除 reg ex 中的否定并反转代码中的匹配条件来做到这一点。但我也不想这样。为此,我需要纯 reg ex 解决方案。

这是我的代码。这确实与有效的姓氏相匹配。但我不想匹配。

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 ex 匹配

情况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>

当姓氏无效时,reg ex 应该匹配

案例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>

如果您需要更多信息,请告诉我

4

3 回答 3

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);
        }
    }
}
于 2010-10-28T15:20:32.653 回答
0

尝试将 RegEx 重写为: <LastName>([a-zA-Z'\s]{0,41})</LastName> 并在其他代码中使用否定:if (!match.success) ...

于 2010-10-28T15:18:47.390 回答
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]。它确实需要 .* 之前和之后,否则它将与包含特殊字符的名称不匹配。

正则表达式模式的第二部分检查长度是否匹配每件事,这就是它不起作用的原因。

祝你好运。

于 2010-10-28T16:46:37.650 回答