0

我正在使用.Net。我想匹配具有 az、AZ、空格和单引号以外的字符的姓氏,字符的 len 不应介于 1-40 之间。必须匹配的字符串是这样的 XML<FirstName>SomeName</FirstName><LastName>SomeLastName</LastName><Address1>Addre1</Address1>

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

4

5 回答 5

1

你可以有否定的字符类。[^abc]匹配任何不是 NOT 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,}not {1,40}。这将确保您只匹配超过 40 个字符的字符串。

于 2010-10-27T20:56:07.800 回答
1

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

如果这就是你真正的意思,那么你需要做的就是将你的转换"regex""^(?:(?!regex).)*$".

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

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

于 2010-10-28T16:21:19.877 回答
0

否定字符是“^”。因此,您的表达式将如下所示:

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

这是微软网站关于否定的链接。

享受

于 2010-10-27T20:57:39.717 回答
0

试试这个模式

"<LastName>([^a-zA-Z'\s])|(.{41,})</LastName>"
于 2010-10-27T21:01:38.930 回答
0

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

/^(<LastName><\/LastName>)|(<LastName>.*[^a-zA-Z'\s]+.*<\/LastName>)|(<LastName>(.{41,})<\/LastName>)$/
于 2010-10-27T21:41:58.693 回答