我正在尝试在.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>如果您需要更多信息,请让我知道
发布于 2010-10-28 23:20:33
如果你给出一个例子,说明它不是你期望的那样,那会很有帮助,但我怀疑这是因为你只匹配了一个无效字符,如果它是一个单独的无效字符,例如
<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-28 23:18:47
尝试将RegEx重写为:<LastName>([a-zA-Z'\s]{0,41})</LastName>,并在其他代码中使用求反:if (!match.success) ...
发布于 2010-10-29 00:46:38
好的,
我不能让它在一遍中完成,但如果你在两遍中完成,我认为它会起作用,首先你检查错误的字符,在第二遍中你检查长度,
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。它在前后都需要.*,否则它将不会与包含特殊字符的名称匹配。
正则表达式模式的第二部分检查长度,匹配所有内容,甚至匹配,这就是它不起作用的原因。
祝好运。
https://stackoverflow.com/questions/4044272
复制相似问题