如何限制正则表达式前后的内容
How do I restrict what comes before and after a regex
我必须创建一个正则表达式来识别电子邮件。这是到目前为止的样子:
[A-Za-z0-9]+([._-]*[A-Za-z0-9]+)*[@]+[A-Za-z0-9]+([._-]*[A-Za-z0-9]+)*(.com)*
我想要使用此正则表达式来识别电子邮件。问题是电子邮件不能以任何非字母数字符号开头或结尾。所以:
.ilikestack@gmail.com or ilikestack@gmail.com_ = invalid
ilike.stack@gmail = valid
但是当我 运行 我的 Lex 程序时,上面的前两封电子邮件被认为是有效的,我不知道如何更改它。
不错!
也许,
(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z0-9]+(\s|$)|(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z0-9]+\.[A-Za-z]+(\s|$)|(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z0-9]+\.[A-Za-z]+\.[A-Za-z]+(\s|$)
Demo 1
或
(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@([A-Za-z0-9]+|([A-Za-z0-9]+\.[A-Za-z0-9]+)*)(\s|$)
可能会更近一些。
如果你想simplify/update/explore这个表达式,在regex101.com. You can watch the matching steps or modify them in this debugger link, if you'd be interested. The debugger demonstrates that how a RegEx engine的右上面板已经解释过可能会逐步消耗一些示例输入字符串并执行匹配过程。
正则表达式电路
jex.im 可视化正则表达式:
这里我们使用量词{2,6}
,它限制了@
符号后的字符:
Demo 2
我们可以将其替换为 +
,如演示 2 所示。但是,这可能不是一个好主意。
如果您想要验证特定类型的电子邮件或域,例如 with,
,最好在表达式中添加更多边界
^[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z]+\.(?:com|net|org|co)(?:\.uk)?$
否则,上面的那些表达式只会传递这么多非电子邮件字符串作为有效电子邮件。
Demo 3
控制正则表达式前后可以出现和不能出现的内容的通常方法是定义另一个正则表达式,或多个匹配相同内容但被无效字符包围的正则表达式。
因此,如果我们有正则表达式 [a-z]+
,但我们只希望它匹配前面只有白色 space(或在文件开头)并且后面只有白色的情况space 或一个点(或文件结尾),我们可以按如下方式完成:
[a-z]+ printf("Successful match: '%s'!\n", yytext);
[^a-z \t\r\n][a-z]+ ;
[a-z]+[^a-z \t\r\n.] ;
. ;
然后输入 ab cd_ ef. .de fg
将产生输出:
Successful match: 'ab'!
Successful match: 'ef'!
Successful match: 'fg'!
对于您的用例,最简单的解决方案是有两个附加规则:一个用于以非电子邮件非白色 space 字符开头并延伸到下一个白色 space 特点。还有一个以不是点的非电子邮件字符(或任何其他允许出现在电子邮件后的字符)结尾的字符:
[^ \t\r\nA-Za-z0-9][^ \t\r\n]* ;
[^ \t\r\n]*[^ \t\r\nA-Za-z0-9.] ;
我必须创建一个正则表达式来识别电子邮件。这是到目前为止的样子:
[A-Za-z0-9]+([._-]*[A-Za-z0-9]+)*[@]+[A-Za-z0-9]+([._-]*[A-Za-z0-9]+)*(.com)*
我想要使用此正则表达式来识别电子邮件。问题是电子邮件不能以任何非字母数字符号开头或结尾。所以:
.ilikestack@gmail.com or ilikestack@gmail.com_ = invalid
ilike.stack@gmail = valid
但是当我 运行 我的 Lex 程序时,上面的前两封电子邮件被认为是有效的,我不知道如何更改它。
不错!
也许,
(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z0-9]+(\s|$)|(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z0-9]+\.[A-Za-z]+(\s|$)|(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z0-9]+\.[A-Za-z]+\.[A-Za-z]+(\s|$)
Demo 1
或
(^|\s)[A-Za-z0-9][A-Za-z0-9._-]*@([A-Za-z0-9]+|([A-Za-z0-9]+\.[A-Za-z0-9]+)*)(\s|$)
可能会更近一些。
如果你想simplify/update/explore这个表达式,在regex101.com. You can watch the matching steps or modify them in this debugger link, if you'd be interested. The debugger demonstrates that how a RegEx engine的右上面板已经解释过可能会逐步消耗一些示例输入字符串并执行匹配过程。
正则表达式电路
jex.im 可视化正则表达式:
这里我们使用量词{2,6}
,它限制了@
符号后的字符:
Demo 2
我们可以将其替换为 +
,如演示 2 所示。但是,这可能不是一个好主意。
如果您想要验证特定类型的电子邮件或域,例如 with,
,最好在表达式中添加更多边界^[A-Za-z0-9][A-Za-z0-9._-]*@[A-Za-z]+\.(?:com|net|org|co)(?:\.uk)?$
否则,上面的那些表达式只会传递这么多非电子邮件字符串作为有效电子邮件。
Demo 3
控制正则表达式前后可以出现和不能出现的内容的通常方法是定义另一个正则表达式,或多个匹配相同内容但被无效字符包围的正则表达式。
因此,如果我们有正则表达式 [a-z]+
,但我们只希望它匹配前面只有白色 space(或在文件开头)并且后面只有白色的情况space 或一个点(或文件结尾),我们可以按如下方式完成:
[a-z]+ printf("Successful match: '%s'!\n", yytext);
[^a-z \t\r\n][a-z]+ ;
[a-z]+[^a-z \t\r\n.] ;
. ;
然后输入 ab cd_ ef. .de fg
将产生输出:
Successful match: 'ab'!
Successful match: 'ef'!
Successful match: 'fg'!
对于您的用例,最简单的解决方案是有两个附加规则:一个用于以非电子邮件非白色 space 字符开头并延伸到下一个白色 space 特点。还有一个以不是点的非电子邮件字符(或任何其他允许出现在电子邮件后的字符)结尾的字符:
[^ \t\r\nA-Za-z0-9][^ \t\r\n]* ;
[^ \t\r\n]*[^ \t\r\nA-Za-z0-9.] ;