Skip to content

M04015: 邮箱验证

strings, RE, http://cs101.openjudge.cn/practice/04015

POJ 注册的时候需要用户输入邮箱,验证邮箱的规则包括: 1)有且仅有一个'@'符号 2)'@'和'.'不能出现在字符串的首和尾 3)'@'之后至少要有一个'.',并且'@'不能和'.'直接相连 满足以上3条的字符串为合法邮箱,否则不合法, 编写程序验证输入是否合法

输入

输入包含若干行,每一行为一个代验证的邮箱地址,长度小于100

输出

每一行输入对应一行输出 如果验证合法,输出 YES 如果验证非法:输出 NO

样例输入

.a@b.com
pku@edu.cn
cs101@gmail.com
cs101@gmail

样例输出

NO
YES
YES
NO

这题目输入没有明确结束,需要套在try ... except里面。测试时候,需要模拟输入结束,看你是window还是mac。If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.

python
while True:
    try:
        s = input()
    except EOFError:
        break
    
    if s.count('@') != 1:
        print("NO"); continue
    
    #if (s[0]=='@' or s[-1]=='@' or s[0]=='.' or s[-1]=='.'):
    if (s[0] in {'@', '.'} or s[-1] in {'@', '.'}):
        print("NO"); continue

    if (s.find("@.")!=-1 or s.find(".@")!=-1):
        print("NO"); continue

    p = s.find("@");
    q = s.find(".", p+1);
    
    '''
    if (q==-1):
        print("NO")
    else:
        print("YES")
    '''
    print('NO' if q==-1 else 'YES')

一次性读入,使用正则表达式。

Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

python
import sys, re

reg = r'^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$'
data = sys.stdin.read().strip().splitlines()

for s in data:
    print('YES' if re.match(reg, s) else 'NO')

唐浴歌经济学院1900015516

题目给的要求是[^@.],也就是说正常字段只需要不是“@”和“.”即可。以前遇到的要求是:正常字段只能是大小写字母或“-”,所以也试了试[\w-]。虽然regulation需要前后match,也就是说前面加一个“^”,后面加一个“$”, 但 是.match函数本身就是从头开始检索的,所以“^”可以删去。

python
# https://www.tutorialspoint.com/python/python_reg_expressions.htm
# https://www.geeksforgeeks.org/python-regex/

import re
while True:
    try:
        s = input()
        reg = r'^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$'
        print('YES' if re.match(reg, s) else 'NO')
    except EOFError:
        break

^:匹配字符串的开始。 [\w-]+:匹配用户名部分的第一个子部分,允许字母、数字、下划线和连字符,至少有一个字符。 (.[\w-]+)*:匹配用户名部分的其余子部分,每个子部分由点分隔,可以有零个或多个这样的子部分。 @:匹配单个 @ 符号。 [\w-]+:匹配域名的第一部分,允许字母、数字、下划线和连字符,至少有一个字符。 (.[\w-]+)+:匹配域名的后续部分,每个部分由点分隔,至少有一个这样的部分,并且每个部分都至少包含一个字符。 $:匹配字符串的结尾,确保整个字符串都被匹配到结尾,不允许多余的字符。

python
# https://www.tutorialspoint.com/python/python_reg_expressions.htm
# https://www.geeksforgeeks.org/python-regex/
import re  
while True: 
    try:
        s = input()
        reg   = r'^[^@\.]+(\.[^@\.]+)*@[^@\.]+(\.[^@\.]+)+$'
        print('YES' if re.match(reg, s) else 'NO')
    except EOFError:
        break

正则表达式遵循以下规则:

^:匹配字符串的开始。

[^@\.]+:匹配不包含 @ 和 . 的字符序列,确保用户名部分不以 @ 或 . 开始。 (\.[^@\.]+)*:允许用户名部分有多个子部分,每个子部分由点分隔。 @:匹配单个 @ 符号。 [^@\.]+:匹配域名的第一部分,确保其不包含 @ 和 .。 (\.[^@\.]+)+:匹配域名的后续部分,每个部分必须至少包含一个非 @ 和 . 的字符,并且必须至少有一个这样的部分。 $:确保整个字符串都被匹配到结尾,不允许多余的字符。

Regular expression相关题目:

​ 04015: 邮箱验证,24834:通配符匹配,

​ CF58A. Chat room, https://codeforces.com/problemset/problem/58/A

​ LeetCode 65. 有效数字,https://leetcode.cn/problems/valid-number/description/

​ Regulex 正则表达式在线测试工具,https://regex101.com