首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reg Ex negation在XML字符串中不起作用

Reg Ex negation在XML字符串中不起作用
EN

Stack Overflow用户
提问于 2010-10-28 23:14:42
回答 3查看 161关注 0票数 1

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
<FirstName>SomeName</FirstName><LastName>Brian</LastName><Address1>Addre1</Address1>

案例2

代码语言:javascript
复制
<FirstName>SomeName</FirstName><LastName>O'neil</LastName><Address1>Addre1</Address1>

案例3

代码语言:javascript
复制
<FirstName>SomeName</FirstName><LastName>Peter John</LastName><Address1>Addre1</Address1>

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

案例4

代码语言:javascript
复制
<FirstName>SomeName</FirstName><LastName>Brian123</LastName><Address1>Addre1</Address1>

案例5

代码语言:javascript
复制
<FirstName>SomeName</FirstName><LastName>#Brian</LastName><Address1>Addre1</Address1>

案例6

代码语言:javascript
复制
<FirstName>SomeName</FirstName><LastName>BrianBrianBrianBrianBrianBrianBrianBrianBrianBrian</LastName><Address1>Addre1</Address1>

如果您需要更多信息,请让我知道

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-28 23:20:33

如果你给出一个例子,说明它不是你期望的那样,那会很有帮助,但我怀疑这是因为你只匹配了一个无效字符,如果它是一个单独的无效字符,例如

代码语言:javascript
复制
<LastName>5</LastName>

这将会匹配(我相信;我还没有检查过),但这不会:

代码语言:javascript
复制
<LastName>55</LastName>

我认为你可以这样做:

代码语言:javascript
复制
<LastName>(.*[^a-zA-Z'\s].*)|(.{41,})</LastName>

以确保其中至少有一个无效字符(或有41个或更多字符)。但在某些情况下,这可能是不合适的。

编辑:明白了。交替运算符将它之前的所有内容都作为一个选项,而不仅仅是前面的组。最后的正则表达式是:

代码语言:javascript
复制
<LastName>((.*[^a-zA-Z'\s].*)|(.{41,}))</LastName>

下面是一些示例代码:

代码语言:javascript
复制
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);
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2010-10-28 23:18:47

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

票数 0
EN

Stack Overflow用户

发布于 2010-10-29 00:46:38

好的,

我不能让它在一遍中完成,但如果你在两遍中完成,我认为它会起作用,首先你检查错误的字符,在第二遍中你检查长度,

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4044272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档