1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| from transitions import Machine
class EmailValidator: states = [ 'start', 'username', 'at_symbol', 'domain', 'dot', 'extension', 'valid', 'invalid' ] def __init__(self): self.machine = Machine(model=self, states=self.states, initial='start') self.current_char = '' self.buffer = '' self.setup_transitions() def setup_transitions(self): self.machine.add_transition('process_char', 'start', 'username', conditions=['is_username_start']) self.machine.add_transition('process_char', 'start', 'invalid') self.machine.add_transition('process_char', 'username', 'at_symbol', conditions=['is_at_symbol']) self.machine.add_transition('process_char', 'username', 'username', conditions=['is_username_char']) self.machine.add_transition('process_char', 'username', 'invalid') self.machine.add_transition('process_char', 'at_symbol', 'domain', conditions=['is_domain_start']) self.machine.add_transition('process_char', 'at_symbol', 'invalid') self.machine.add_transition('process_char', 'domain', 'dot', conditions=['is_dot']) self.machine.add_transition('process_char', 'domain', 'domain', conditions=['is_domain_char']) self.machine.add_transition('process_char', 'domain', 'invalid') self.machine.add_transition('process_char', 'dot', 'extension', conditions=['is_extension_start']) self.machine.add_transition('process_char', 'dot', 'invalid') self.machine.add_transition('process_char', 'extension', 'extension', conditions=['is_extension_char']) self.machine.add_transition('process_char', 'extension', 'invalid') self.machine.add_transition('finish', 'extension', 'valid') self.machine.add_transition('finish', '*', 'invalid') def is_username_start(self): return self.current_char.isalnum() def is_username_char(self): return self.current_char.isalnum() or self.current_char in '._-' def is_at_symbol(self): return self.current_char == '@' def is_domain_start(self): return self.current_char.isalnum() def is_domain_char(self): return self.current_char.isalnum() or self.current_char == '-' def is_dot(self): return self.current_char == '.' def is_extension_start(self): return self.current_char.isalpha() def is_extension_char(self): return self.current_char.isalpha() def validate(self, email): """验证邮箱地址""" self.to_start() self.buffer = '' print(f"验证邮箱: {email}") for i, char in enumerate(email): self.current_char = char self.buffer += char print(f" 字符 '{char}' -> 状态: {self.state}", end='') try: self.process_char() print(f" -> {self.state}") if self.state == 'invalid': return False except Exception as e: print(f" -> 转换失败: {e}") return False try: self.finish() return self.state == 'valid' except: return False
validator = EmailValidator()
test_emails = [ "user@domain.com", "test.email@example.org", "invalid.email", "@domain.com", "user@.com", "user@domain.", "user@domain.c0m", ]
for email in test_emails: result = validator.validate(email) print(f"结果: {'✅ 有效' if result else '❌ 无效'}\n")
|