正则表达式否定

时间:2010-10-27 20:53:12

标签: .net regex regex-negation

我正在使用.Net。我希望匹配除了a-z,A-Z,空格和单引号之外的字符的姓氏,而字符的len不应该在1-40之间。必须匹配的字符串是XML,如<FirstName>SomeName</FirstName><LastName>SomeLastName</LastName><Address1>Addre1</Address1>

我写了regualr表达式,但只匹配 [a-zA-Z'。\ s] {1,40} <LastName>[a-zA-Z'.\s]{1,40}</LastName>编辑:错过LastName标记。但是我想要否定这个表达方式。这是可能的还是应该采取不同的方法?

5 个答案:

答案 0 :(得分:1)

您可以使用否定的字符类。 [^abc]匹配任何非abc的字符。对于您的情况,您可能需要[^a-zA-Z'.\s]{1,40}

由于您的数据是XML标记,因此您可能希望首先从中提取数据。 XML和正则表达式并不总是很好地混合。


如果绝对必须处理正则表达式中的XML标记,可以尝试这样的方法:

<FirstName>([^a-zA-Z'.\s]{1,40})</FirstName><LastName>([^a-zA-Z'.\s]{1,40})</LastName>

捕获组1将是第一个名称,捕获组2将是姓氏。


误读原始问题,如果您要匹配超过40个字符的字符串,则长度应为{41,}而不是{1,40}。这将确保您只匹配超过40个字符的字符串。

答案 1 :(得分:1)

您似乎想知道如何在不使用语言中的某些“非”类型逻辑的情况下否定模式匹配,而是将其置于模式匹配中。

如果这就是您的真实含义,您只需将"regex"转换为"^(?:(?!regex).)*$"

第一个适用于任何包含“regex”的字符串,第二个适用于任何不包含“regex”的字符串。

我想如果你想要注意多行输入字符串,那么"\A(?:(?!regex)(?s).)*\z"应该是非常小心的。

答案 2 :(得分:0)

否定字符是“^”。所以你的表达式如下:

[^a-zA-Z'\S]{1,40}

Here is a link to Microsoft's site about negation.

享受

答案 3 :(得分:0)

尝试这种模式

"<LastName>([^a-zA-Z'\s])|(.{41,})</LastName>"

答案 4 :(得分:0)

[编辑] - 删除了其他东西。这些东西适用于我的测试中的所有条件(包括空),包括测试字符串中的XML。

/^(<LastName><\/LastName>)|(<LastName>.*[^a-zA-Z'\s]+.*<\/LastName>)|(<LastName>(.{41,})<\/LastName>)$/