fn isalphanum(c: char) -> bool {
return c.is_alphabetic() || c.is_numeric();
}
fn isdot(c: char) -> bool {
return c == '.';
}
fn isatmark(c: char) -> bool {
return c == '@';
}
fn isend(c: char) -> bool {
return c == '$';
}
fn isemail(mut s: String) -> bool {
s += "$";
let INIT = 0;
let LOCAL_NOTDOT = 1;
let LOCAL_DOT = 2;
let ATMART = 3;
let DOMAIN_NOTDOT = 4;
let DOMAIN_DOT = 5;
let OK = 6;
let NG = 7;
let mut state = INIT;
for c in s.chars() {
if state == INIT {
if isalphanum(c) {
state = LOCAL_NOTDOT;
} else {
state = NG;
break;
}
} else if state == LOCAL_NOTDOT {
if isalphanum(c) {
state = LOCAL_NOTDOT;
} else if isdot(c) {
state = LOCAL_DOT;
} else if isatmark(c) {
state = ATMART;
} else {
state = NG;
break;
}
} else if state == LOCAL_DOT {
if isalphanum(c) {
state = LOCAL_NOTDOT;
} else {
state = NG;
break;
}
} else if state == ATMART {
if isalphanum(c) {
state = DOMAIN_NOTDOT;
} else {
state = NG;
break;
}
} else if state == DOMAIN_NOTDOT {
if isalphanum(c) {
state = DOMAIN_NOTDOT;
} else if isdot(c) {
state = DOMAIN_DOT;
} else if isend(c) {
state = OK;
} else {
state = NG;
break;
}
} else if state == DOMAIN_DOT {
if isalphanum(c) {
state = DOMAIN_NOTDOT;
} else {
state = NG;
break;
}
} else if state == OK {
break;
} else if state == NG {
break;
} else {
state = NG
}
}
return state == OK;
}
fn main() {
let email = "t@g.m".to_string();
if isemail(email.clone()) {
println!("メールアドレスです。{}", email);
} else {
println!("メールアドレスではありません。");
}
}
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s
Running `target/debug/basic`
メールアドレスです。t@g.m