Code Golf:无需正则表达式的电子邮件地址验证
(编辑:什么是 Code Golf:Code Golf 是一种以最短的代码量(按您喜欢的语言的字符数)解决特定问题的挑战。 有关 Meta StackOverflow 的更多信息。)
代码高尔夫球手,这里有一个关于字符串操作的挑战。
电子邮件地址验证,但当然没有正则表达式(或类似的解析库)。重要的不是电子邮件地址,而是您可以编写下面给出的不同字符串操作和约束的长度。
规则如下(是的,我知道,这不符合 RFC,但这些将成为此挑战的 5 条规则):
@: 之前至少有 1 个字符在该组中
<前><代码>AZ、az、0-9、. (句点),_(下划线)@ 必须存在,且恰好一次
[电子邮件受保护] ^
句号 (.) 必须在 @ 之后恰好存在一次
[电子邮件受保护] ^
@ 和后面的 之间至少有 1 个仅 [AZ, az] 字符。 (句号)
[电子邮件受保护] ^
最后的 后至少有 2 个仅 [AZ, az] 个字符。期间
[电子邮件受保护] ^^
请仅发布方法/函数,该方法/函数将采用字符串(建议的电子邮件地址),然后根据电子邮件地址有效(真)或无效(假)返回布尔结果(真/假)。< /strong>
Samples:
[email protected] (valid/true) @w.org (invalid/false)
b@[email protected] (invalid/false) test@org (invalid/false)
test@%.org (invalid/false) s%[email protected] (invalid/false)
[email protected] (invalid/false) [email protected] (valid/true)
[email protected] (valid/true) foo@a%.com (invalid/false)
祝你好运!
(Edit: What is Code Golf: Code Golf are challenges to solve a specific problem with the shortest amount of code by character count in whichever language you prefer. More info here on Meta StackOverflow. )
Code Golfers, here's a challenge on string operations.
Email Address Validation, but without regular expressions (or similar parsing library) of course. It's not so much about the email addresses but how short you can write the different string operations and constraints given below.
The rules are the following (yes, I know, this is not RFC compliant, but these are going to be the 5 rules for this challenge):
At least 1 character out of this group before the @:
A-Z, a-z, 0-9, . (period), _ (underscore)
@ has to exist, exactly one time
[email protected] ^
Period (.) has to exist exactly one time after the @
[email protected] ^
At least 1 only [A-Z, a-z] character between @ and the following . (period)
[email protected] ^
At least 2 only [A-Z, a-z] characters after the final . period
[email protected] ^^
Please post the method/function only, which would take a string (proposed email address) and then return a Boolean result (true/false) depending on the email address being valid (true) or invalid (false).
Samples:
[email protected] (valid/true) @w.org (invalid/false)
b@[email protected] (invalid/false) test@org (invalid/false)
test@%.org (invalid/false) s%[email protected] (invalid/false)
[email protected] (invalid/false) [email protected] (valid/true)
[email protected] (valid/true) foo@a%.com (invalid/false)
Good luck!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
C89(166 个字符)
不可重入,但可以运行多次。试验台:
C89 (166 characters)
Not re-entrant, but can be run multiple times. Test bed:
J
J
C89,175 个字符。
我正在使用标准库函数
strspn()
,所以我觉得这个答案不像 strager 的答案那么“干净”,它没有任何库函数。 (我还窃取了他声明不带类型的全局变量的想法!)这里的技巧之一是将
.
和_
放在字符串的开头>A
,可以在strspn()
测试中轻松包含或排除它们:当您想要允许它们时,请使用strspn(something, A)
;如果不这样做,请使用strspn(something, A+12)
。另一种方法是假设sizeof (short) == 2 * sizeof (char)
,并从“种子”对Aa
一次构建有效字符数组 2 个。剩下的只是寻找一种方法来强制子表达式看起来足够相似,以便可以将它们拉出到#defined 宏中。为了使此代码更“可移植”(heh :-P),您可以将数组构建代码从 更改为 ,但
需要
额外增加 5 个字符。
C89, 175 characters.
I am using the standard library function
strspn()
, so I feel this answer isn't as "clean" as strager's answer which does without any library functions. (I also stole his idea of declaring a global variable without a type!)One of the tricks here is that by putting
.
and_
at the start of the stringA
, it's possible to include or exclude them easily in astrspn()
test: when you want to allow them, usestrspn(something, A)
; when you don't, usestrspn(something, A+12)
. Another is assuming thatsizeof (short) == 2 * sizeof (char)
, and building up the array of valid characters 2 at a time from the "seed" pairAa
. The rest was just looking for a way to force subexpressions to look similar enough that they could be pulled out into#define
d macros.To make this code more "portable" (heh :-P) you can change the array-building code from
to
for a cost of 5 additional characters.
Python(181 个字符,包括换行符)
基本上只是一个使用令人困惑的短变量名的状态机。
Python (181 characters including newlines)
Basically just a state machine using obfuscatingly short variable names.
C (166 个字符)
需要单个换行符,我将其算作一个字符。
C (166 characters)
The single newline is required, and I've counted it as one character.
Python,149 个字符(将整个
for
循环放入一个分号分隔的行中,出于“可读性”目的,我没有在此处这样做):测试案例,借用strager的答案:
解释:迭代字符串时,两个变量不断更新。
t
保持当前状态:t = 0
:我们正处于开始阶段。t = 1
:我们从一开始就找到了至少一个合法字符(字母、数字、下划线、句点)t = 2
:我们找到了“< code>@"t = 3
:我们在“@
”之后至少找到了一个合法字符(即字母)t = 4< /code>:我们在域名中找到了句点
t = 5
:我们在句点后面找到了一个合法字符(字母)t = 6
:我们发现句号o
后至少有两个合法字符,如“okay”,以
1
开头,即 true,并且一旦满足就会设置为0
发现一个字符在当前状态下是非法的。合法字符为:
0
下:字母、数字、下划线、句点(在任何情况下将状态更改为1
)1
下:字母、数字、下划线、句点、at 符号(如果找到“@
”,则将状态更改为2
)2
中:字母(更改状态到3
)3
中:字母、句点(如果找到句点,则将状态更改为 4)4
到6< /code>:字母(在
4
或5
时递增状态)当我们遍历完字符串后,我们返回是否
t==6< /code>(
t>5
少一个字符),o
为 1。Python, 149 chars (after putting the whole
for
loop into one semicolon-separated line, which I haven't done here for "readability" purposes):Test cases, borrowed from strager's answer:
Explanation: When iterating over the string, two variables keep getting updated.
t
keeps the current state:t = 0
: We're at the beginning.t = 1
: We where at the beginning and have found at least one legal character (letter, number, underscore, period)t = 2
: We have found the "@
"t = 3
: We have found at least on legal character (i.e. letter) after the "@
"t = 4
: We have found the period in the domain namet = 5
: We have found one legal character (letter) after the periodt = 6
: We have found at least two legal characters after the periodo
as in "okay" starts as1
, i.e. true, and is set to0
as soon as a character is found that is illegal in the current state.Legal characters are:
0
: letter, number, underscore, period (change state to1
in any case)1
: letter, number, underscore, period, at-sign (change state to2
if "@
" is found)2
: letter (change state to3
)3
: letter, period (change state to 4 if period found)4
thru6
: letter (increment state when in4
or5
)When we have gone all the way through the string, we return whether
t==6
(t>5
is one char less) ando
is 1.MSVC2008 支持的任何 C++ 版本。
这是我的谦卑的提交。现在我知道为什么他们告诉我永远不要做我在这里所做的事情:
Whatever version of C++ MSVC2008 supports.
Here's my humble submission. Now I know why they told me never to do the things I did in here:
毫无疑问,这不是最好的解决方案,而且相当冗长,但它是有效的。
已修复(所有测试用例现已通过)
Not the greatest solution no doubt, and pretty darn verbose, but it is valid.
Fixed (All test cases pass now)
C89 字符集不可知(262 个字符)
版本 2
仍然是 C89 字符集不可知,希望纠正错误(303 个字符;没有 #include 的 284 个字符)
#define X 绝对令人恶心!
测试我的第一个(有缺陷的)版本。
C89 character set agnostic (262 characters)
Version 2
Still C89 character set agnostic, bugs hopefully corrected (303 chars; 284 without the #include)
That #define X is absolutely disgusting!
Test as for my first (buggy) version.
VBA/VB6 - 484 个字符
显式关闭
用法:VE("[电子邮件受保护]")
VBA/VB6 - 484 chars
Explicit off
usage: VE("[email protected]")
Java:257 个字符(不包括 3 个行尾以提高可读性;-))。
通过所有测试(我的旧版本不正确)。
Java: 257 chars (not including the 3 end of lines for readability ;-)).
Passes all the tests (my older version was incorrect).
Erlang 266 个字符:
Erlang 266 chars:
Ruby,225 个字符。
这是我的第一个 Ruby 程序,所以它可能不太像 Ruby :-)
Ruby, 225 chars.
This is my first Ruby program, so it's probably not very Ruby-like :-)
“不使用正则表达式”:
PHP 47 个字符。
'Using no regex':
PHP 47 Chars.
Haskell (GHC 6.8.2),
165161144C 字符使用模式匹配,
elem
,span
和all
:使用以下代码测试了上述内容:
Haskell (GHC 6.8.2),
165161144C CharactersUsing pattern matching,
elem
,span
andall
:The above was tested with the following code: