`
coding1688
  • 浏览: 236811 次
  • 来自: 上海
社区版块
存档分类
最新评论

写email地址的正则表达式不容易

 
阅读更多

从文本内容中提取email地址

当然用正则表达式啦。代码如下:

 

import java.util.regex.Matcher;
import java.util.regex.Pattern;


Pattern pattern = Pattern.compile("[-\\w\\.]+@[-\\w\\.]+");

// s是待处理的文本
                        Matcher m = pattern.matcher(s);
                        while (m.find()) {
                            String email = s.substring(m.start(), m.end());
                            log.debug("email found " + email);
                        }
 

 

当然,上面的email的正则表达式的写法不那么严谨。

 

email的规范格式,在[RFC 2822] Internet Message Format中有详细说明。

 

http://tools.ietf.org/html/rfc2822#section-3.4.1 写道
3.4.1. Addr-spec specification


An addr-spec is a specific Internet identifier that contains a
locally interpreted string followed by the at-sign character ("@",
ASCII value 64) followed by an Internet domain. The locally
interpreted string is either a quoted-string or a dot-atom. If the
string can be represented as a dot-atom (that is, it contains no
characters other than atext characters or "." surrounded by atext
characters), then the dot-atom form SHOULD be used and the
quoted-string form SHOULD NOT be used. Comments and folding white
space SHOULD NOT be used around the "@" in the addr-spec.

addr-spec = local-part "@" domain

local-part = dot-atom / quoted-string / obs-local-part

domain = dot-atom / domain-literal / obs-domain

domain-literal = [CFWS] "[" *([FWS] dcontent) [FWS] "]" [CFWS]

dcontent = dtext / quoted-pair

dtext = NO-WS-CTL / ; Non white space controls

%d33-90 / ; The rest of the US-ASCII
%d94-126 ; characters not including "[",
; "]", or "\"

The domain portion identifies the point to which the mail is
delivered. In the dot-atom form, this is interpreted as an Internet
domain name (either a host name or a mail exchanger name) as
described in [STD3, STD13, STD14]. In the domain-literal form, the
domain is interpreted as the literal Internet address of the
particular host. In both cases, how addressing is used and how
messages are transported to a particular host is covered in the mail
transport document [RFC2821]. These mechanisms are outside of the
scope of this document.

The local-part portion is a domain dependent string. In addresses,
it is simply interpreted on the particular host as a name of a
particular mailbox.
 

 

大名鼎鼎的 jquery validation 中是这样来写email的正则表达式的

 

        // http://docs.jquery.com/Plugins/Validation/Methods/email
        email: function(value, element) {
            // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
            return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_
`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22
)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\u
FFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])(
[a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
        },

 

 

的确够复杂,其中的字符还可以包括很多unicode字符。代码的注释中,有一行提供了一个网址:http://projects.scottsplayground.com/email_address_validation/ ,访问之后找到了一个js代码,很详细的写了email的各个构成部分的验证,是根据 RFC 2822 来的。

 

// 以下代码来自 http://projects.scottsplayground.com/email_address_validation/lib/email.js

/*
 * Email addresses
 * 
 * Definitions from (unless otherwise noted):
 * - [RFC 2822] Internet Message Format
 */

// internationalized
var text =
	"(" +
		"[" +
			"\\x01-\\x09" +
			"\\x0b" +
			"\\x0c" +
			"\\x0d-\\x7f" +
		"]" +
		"|" + ucschar +
	")";

var NOWSCTL =
	"[" +
		"\\x01-\\x08" +
		"\\x0b" +
		"\\x0c" +
		"\\x0e-\\x1f" +
		"\\x7f" +
	"]";

// section 2.2.2 Header Fields
var SP = "\\x20";
var HTAB = "\\x09";
var WSP =
	"(" +
		SP +
		"|" + HTAB +
	")";

// section 2.1 General Description
var CRLF = "(\\x0d\\x0a)";

// removed obsolete folding white space (obs-FWS)
var FWS =
	"(" +
		"(" +
			WSP + "*" +
			CRLF +
		")?" +
		WSP + "+" +
	")";

var DQUOTE = "(\\x22)";

// internationalized
var qtext =
	"(" +
		NOWSCTL +
		"|\\x21" +
		"|[\\x23-\\x5b]" +
		"|[\\x5d-\\x7e]" +
		"|" + ucschar +
	")";

// removed obsolete quoted pair (obs-qp)
var quotedPair =
	"(" +
		"\\\\" +
		text +
	")";

var qcontent =
	"(" +
		qtext +
		"|" + quotedPair +
	")";

// removed comments and folding white space (CFWS)
var quotedString =
	"(" +
		DQUOTE +
		"(" +
			FWS + "?" +
			qcontent +
		")*" +
		FWS + "?" +
		DQUOTE +
	")";

// created from symbols in atext
var atextSymbols = "[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]";

// internationalized
var atext =
	"(" +
		ALPHA +
		"|" + DIGIT +
		"|" + atextSymbols +
		"|" + ucschar +
	")";

var dotAtomText =
	"(" +
		atext + "+" +
		"(" +
			"\\." +
			atext + "+" +
		")*" +
	")";

// removed comments and folding white space (CFWS)
var dotAtom = dotAtomText;

// removed comments and folding white space (CFWS)
var atom = atext + "+";

// ihostName from iri.http.js (http://projects.scottsplayground.com/iri)
var domain = ihostName;

// removed obsolete local part (obs-local-part)
var localPart =
	"(" +
		dotAtom +
		"|" + quotedString +
	")";

var addrSpec = localPart + "@" + domain;
 

 

另外一个很好的说明文档是 http://www.markussipila.info/pub/emailvalidator.php

它提供了两种形式的正则表达式,一种是比较正常的格式,一种比较奇怪的格式(包含!#$之类的)。如下所示:

 

// define a regular expression for "normal" addresses
$normal = "^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,4})$"; 

// define a regular expression for "strange looking" but syntactically valid addresses
$validButRare = "^[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,})$"; 

if (eregi($normal, $email)) {
  echo("The address $email is valid and looks normal.");
} else if (eregi($validButRare, $email)) {
  echo("The address $email looks a bit strange but it is syntactically valid. You might want to check it for typos.");
} else {
  echo("The address $email is not valid.");
}
 

 

 

7
6
分享到:
评论
1 楼 shirne 2012-04-28  
Mark下,以后用得着

相关推荐

    正则表达式 java高级编程 识别邮件地址

    编写一个能有效匹配大部分邮件地址的正则表达式并不简单,因为实际的邮件地址规范相当复杂。以下是一个相对宽松但能涵盖大多数常见情况的正则表达式示例: ```java String regex = "^[\\w\\.-]+@([\\w\\-]+\\.)+[\\...

    几个常用的经典正则表达式

    ### 几个常用的经典正则表达式 在日常开发工作中,正则表达式是一种非常实用且强大的工具,它可以帮助我们高效地完成字符串的搜索、替换等操作。下面将详细介绍几个经典的正则表达式及其应用场景。 #### 1. 匹配...

    正则表达式

    无论是用正则表达式直接量还是用构造函数RegExp(),创建一个RegExp对象都是比较容易的.较为困难的任务是用正则表达式语法来描述字符的模式. JavaScript采用的是Perl语言正则表达式语法的一个相当完整的子集. 正则...

    JavaVerbalExpressions一个Java库帮助你构建困难的正则表达式

    例如,要创建一个匹配电子邮件地址的正则表达式,你可以逐步添加规则,如检查是否有“@”符号、域名、顶级域名等,而不是一次性写出整个复杂的正则表达式。 以下是一些JavaVerbalExpressions库常用的方法和概念: ...

    Python正则表达式完全指南

    例如,要匹配所有邮箱地址,我们可以使用如下正则表达式: ```python import re email_re = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' text = """ ... <p class="">34613453@qq.com,谢谢了 ...

    ASP 正则表达式的应用使用说明

    如果不使用正则表达式,编写相应的判断逻辑可能会非常繁琐并且容易出错。使用正则表达式则可以轻松实现这些功能,只需简单的正则表达式模式即可完成验证。 在搜索和替换方面,传统的搜索替换方法需要提供确切的文字...

    PHP使用正则验证数据

    其中,利用正则表达式进行数据验证是一种常见而有效的方法。 #### 一、正则表达式的概念 正则表达式(Regular Expression),通常被简称为regex或regexp,是一种用于匹配字符串中字符组合的模式。通过正则表达式的...

    js验证大全

    这个函数使用了一个正则表达式来匹配常见的电子邮件地址格式。 ### 二、自定义HTML标签与JavaScript结合 #### 1. 自定义标签的概念 自定义HTML标签是HTML5引入的一个新特性,允许开发者创建自己的元素,这可以提高...

    小旋风垂直搜索平台,快速拱建垂直搜索引擎

    二是正则表达式的规则太难维护,源网站只要有一点点的变更,可能导致模板要重新更换。 我们从设计之初就重视并解决这个问题,采用国际标准的xml/xpath路径描述语言,在我们的系统,html自动转换为标准的xml文档。...

    php验证邮箱和ip地址最简单方法汇总

    此外,文章提到的使用PHP自带函数进行操作的方法,主要指的就是使用filter_var函数,因为它的使用简单,不需要复杂的正则表达式编写,也不容易出错,非常适合验证邮箱、IP地址和URL等格式标准的数据。通过示例代码和...

    Java邮箱地址验证 jaev

    在Java中,我们可以使用正则表达式或者Java内置的`java.util.regex.Pattern`和`java.util.regex.Matcher`类来验证邮箱地址。然而,这种方法往往比较复杂,容易出错,而且不能涵盖所有有效的邮箱格式。Jaev库提供了一...

    屏蔽机器人从你的网站搜取email地址的php代码

    这个函数首先定义了一个正则表达式模式来匹配电子邮件地址: ```php $pattern='/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})/i'; ``` 这个正则表达式解释如下: - `[a-zA-Z0-9._%+-]+` 匹配电子邮件用户名...

    JQuery+PHP对HTML表单进行验证

    3. **正则表达式**:可以使用正则表达式来检查特定格式的输入,如电子邮件或电话号码。例如,验证邮箱格式: ```javascript var emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; if (!...

    email-is-valid-开源

    3. 正则表达式:PHP中通常使用正则表达式(Regex)来验证电子邮件地址。正则表达式是一种强大的文本匹配模式,可以用来检测字符串是否符合特定的模式。对于电子邮件验证,一个基本的正则表达式可能包括@符号、至少一...

    ASP.NET简单的注册页面和跳转

    正则表达式是用于匹配字符串模式的强大工具,可以确保输入的邮箱地址符合常见格式(如:`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`),QQ号码(通常为纯数字)也是同样的道理。 接下来,"跳转"指的是页面...

    javascript表单验证

    - **邮箱验证**:利用正则表达式判断输入是否符合邮箱格式,如`/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/`。 - **数字验证**:检查输入是否为整数或浮点数,可使用`isNaN`函数或正则表达式。 - **电话...

    登陆界面表单提交js特效特效代码

    6. **安全考虑**:虽然JavaScript验证可以提高用户体验,但不应完全依赖客户端验证,因为其容易被绕过。服务器端验证仍然是必要的,以防止恶意用户提交无效或有害的数据。 从压缩包中的文件名来看,"使用帮助.txt...

    PHP自带方法验证邮箱、URL、IP是否合法的函数

    以往开发者通常会使用正则表达式来进行这种验证,但编写正则表达式有时可能较为复杂,且容易出错。PHP提供了一个内置的函数`filter_var`,它可以简化这一过程,确保数据过滤和验证的准确性。 `filter_var`函数的...

Global site tag (gtag.js) - Google Analytics