我正在使用.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标记。但是我想要否定这个表达方式。这是可能的还是应该采取不同的方法?
答案 0 :(得分:1)
您可以使用否定的字符类。 [^abc]
匹配任何非a
,b
或c
的字符。对于您的情况,您可能需要[^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)
答案 3 :(得分:0)
尝试这种模式
"<LastName>([^a-zA-Z'\s])|(.{41,})</LastName>"
答案 4 :(得分:0)
[编辑] - 删除了其他东西。这些东西适用于我的测试中的所有条件(包括空),包括测试字符串中的XML。
/^(<LastName><\/LastName>)|(<LastName>.*[^a-zA-Z'\s]+.*<\/LastName>)|(<LastName>(.{41,})<\/LastName>)$/