【发布时间】:2011-05-01 22:49:55
【问题描述】:
我正在尝试对 .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 匹配
案例一
<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>
如果您需要更多信息,请告诉我
【问题讨论】:
-
为什么你不想解析 XML?在 XML 上使用正则表达式是个坏主意——它非常脆弱。
-
你为什么不继续你昨天问的问题,开始一个新的,stackoverflow.com/questions/4037631/reg-ex-negation/…
-
请听 Skeet 男子的声音并停止。您认为这在生产中“完美运行”,但是一旦您遇到任何异常,例如已转义的字符 (
O&#39;Reilly),或 XML 格式中任何微小的完全有效的更改,例如新属性或者只是标记中的一些空格,您的正则表达式将很难失败。这是超级脆的。 .NET 具有良好的 XML 支持,这使得从此类格式中正确提取简单的 XML 数据变得异常容易。使用它,您的代码将更加健壮并且更具可读性。 -
我敢打赌,在这种情况下,“这在生产中完美运行”意味着“如果它在 1% 的时间内失败,我们无法知道这一点。”
-
“但就这个问题而言,我们不想解析 XML。”然后不要使用 XML。使用您完全理解的更简单的格式。人们使用 XML 而不对其进行解析的唯一情况是 a) 当他们不理解 XML 或 b) 当他们不应该使用 XML。
标签: .net xml regex-negation