.net Reg-Ex否定

.net Reg-Ex否定,.net,regex,regex-negation,.net,Regex,Regex Negation,我正在使用.Net。我想匹配除a-z、a-z、空格和单引号之外的字符的姓氏,字符的长度不应在1-40之间。必须匹配的字符串是如下所示的XML 我写了正则表达式,但这只是匹配而已 [a-zA-Z'.\s]{1,40}[a-zA-Z'.\s]{1,40}编辑:缺少LastName标记。但我想得到这个表达式的否定。这是可能的还是我应该采取不同的方法?您可以使用否定字符类[^abc]匹配任何不是a、b或c的字符。对于您的情况,您可能需要[^a-zA-Z'.\s]{1,40} 因为您的数据是XML标记,所

我正在使用.Net。我想匹配除a-z、a-z、空格和单引号之外的字符的姓氏,字符的长度不应在1-40之间。必须匹配的字符串是如下所示的XML

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

您可以使用否定字符类<代码>[^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>
([^a-zA-Z'.\s]{1,40})([^a-zA-Z'.\s]{1,40})
捕获组1将是名字,捕获组2将是姓氏


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

求反字符为“^”。因此,您的表达式如下所示:

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

享受

试试这个模式

"<LastName>([^a-zA-Z'\s])|(.{41,})</LastName>"
([^a-zA-Z'\s])|(.{41,})”
[EDIT]-删除了其他内容。在我的测试中,有一些东西适用于所有条件(包括空),包括测试字符串中的XML

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

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

如果这是您真正的意思,那么您所需要做的就是将
“regex”
转换为
“^(?(?!regex)。*$”

第一种方法适用于任何包含“regex”的字符串,第二种方法适用于任何不包含“regex”的字符串



我想如果你想注意多行输入字符串,那应该是
“\A(?:(?!regex)(?s)。*\z”
,只是为了格外小心。

请确认。您想要求姓氏中有40个以上的字符吗???您是否将XML计算为长度的一部分?我建议您使用XML解析器,这样您就可以只处理姓氏进行验证了……但这只是我的问题。我说过我想要的是不在1到40之间的仅匹配字符。这意味着只允许40个字符。XML不是长度的一部分。在我的情况下,我无法解析xml。我在下面编辑了我的答案…不确定是否收到编辑通知,因此添加了此评论。我没有看到回复。我修改了我的帖子,以便它能够处理XML。我正确地匹配了空XML标记、包含无效数据的XML标记以及包含41个或更多字符的XML标记。如果您能让我知道这是否为您解决了问题,那就太好了。我认为插入符号只需在打开方括号后插入一次即可。@fructedWithFormsDesigner-很好,是的,您是正确的。谢谢由于代码限制,当字符数超过40个时,它失败了,我无法解析XML。这可能是对XML的应用程序否定吗?如果XML保持如此简单,您可以找到
和所有地址内容(如果您不感兴趣)并替换为null,然后进行正则表达式匹配。如果我有机会对代码进行大量更改,我将使用Match.Success==false属性在.Net代码本身中应用if条件。但我想在Reg Exp中实现这一点itself@FrustratedWithFormsDesigner我尝试使用您的注册表项([^a-zA-Z'.\s]{41,}),但它与包含数字SomeNamebrian6Addre1的字符串不匹配。此SomeName不适用。Reg不应与上面的字符串匹配。是的,它显然不适用于此,因为此模式不匹配a-z、a-z not'和空格或任何长度大于40的字符,您刚才提到的是您需要的,您说您希望对匹配英文字符的regex进行求反,qoute和空格,长度介于1和40之间。如果您没有将其包含在LastName节点中,它将适用于您使用的测试文本,因为它与长度超过40的文本相匹配,请立即尝试。我更新了此“SomeNameSomeAddre1”的模式未取消匹配表示它失败。是的,已写入100个筛选器。在.net中应用reg ex后,他们都在检查match.success==true。我所处的情况是,我无法单独更改此筛选器的代码match.success==false。这就是为什么我想在不接触.net代码的情况下实现all in否定。我的问题中遗漏了一些方法。请再次检查问题。我希望这个reg-ex需要应用于XML。不仅仅是在提取的姓氏上。我修改了reg ex,比如:^([a-zA-Z'\s]*[^a-zA-Z'\s]+[a-zA-Z'\s]*)|([a-zA-Z'\s]{41,}),但没有匹配姓氏中包含数字的字符串SomeNameBrian6Addre1好的,应该这样做。在上面发布了一个表达式,该表达式也处理字符串中的XML。我试过像这样的reg-ex ^(?(?!([a-zA-Z'.\s]{1,40}))*$。但与ast名称中包含数字的字符串不匹配SomeNamebrian6Addre1@amz那是不对的。你误解了。当然,它不匹配,你有整个字符串锚在模式的中间。你的角色类别全错了。你必须说你不想要的,而不是你做的。如果你不想要一个数字,匹配你想要的,然后看看那里是否有一个数字。我担心复杂的正则表达式构造对于您现在的学习路径来说有点复杂。从另一个线程获得了答案