如何将两个正则表达式合二为一?

how can I join two regex into one?

提问人:kurasa 提问时间:4/23/2015 最后编辑:Communitykurasa 更新时间:4/24/2015 访问量:196

问:

我有两个正则表达式,我需要将其合并为一个,因为我在 ASP.NET 中使用 RegularExpressionAttribute,并且它不允许多个实例。

如何将以下两个正则表达式合二为一?

.*?@(?!.*?\.\.)[^@]+$
[\x00-\x7F]

第一个检查电子邮件的域部分中是否没有 2 个连续的点,第二个正则表达式检查所有字符是否都是 ASCII

我以为这可能就像将它们连接在一起一样容易,但这行不通(.*?@(?!.*?\.\.)[^@]+$)([\x00-\x7F])

这是与此问题相关的上一篇文章的链接

编辑:我正在使用 reglarexpression 属性装饰我的视图模型的字符串属性,并且它使用不显眼的方式呈现为 javascript,因此它必须使用 javascript 进行验证。我在最初的帖子中没有提到这一点

asp.net regex unobtrusive-javascript

评论


答:

3赞 anubhava 4/23/2015 #1

您可以使用:

^[\x00-\x7F]+?@(?!.*?\.\.)(?=[\x01-\x7F]+$)[^@]+$

评论

0赞 Wiktor Stribiżew 4/23/2015
您的正则表达式也将匹配 。444@[email protected]
0赞 Wiktor Stribiżew 4/23/2015
我记得你说过,不是吗?:)look-arounds are expensive
0赞 anubhava 4/23/2015
我不记得我是在什么问题上发表过这种声明的。但总的来说,是的,如果有其他选择,那么请避免环顾四周。但是,OP 已经在使用前瞻(?!.*?\.\.)
0赞 kurasa 4/24/2015
谢谢你的回答。不幸的是,我只能选择一个答案。我给你投了赞成票
0赞 kurasa 4/24/2015
如上所述 - 我的单元测试通过,但实际上在页面上不起作用。我将编辑我的问题并表明我的意思
3赞 Wiktor Stribiżew 4/23/2015 #2

你可以只使用这个正则表达式

^[\x00-\x7F-[@]]*?@(?!.*?\.\.)[\x00-\x7F-[@]]+$

或者,如果您想在以下之前匹配至少 1 个字符:@

^[\x00-\x7F]+@(?!.*?\.\.)[\x00-\x7F-[@]]+$

思想也包括符号。在 C# 正则表达式中,我们可以在字符类中使用从范围中减去它。[\x00-\x7F]@-[@]

而且您不需要锚点,因为我相信您在 RegularExpressionAttribute 中使用它。

这是 regexstorm.net 上的演示,删除第二个,您将进行匹配。@

评论

0赞 Wiktor Stribiżew 4/24/2015
我修复了它,因为我忘记将锚点和字符类减法添加到第一个范围出现。但是,由于您更新了问题,指出正则表达式需要与 javascript 一起使用,我同意这是行不通的。