从文本内容中提取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.");
}
分享到:
相关推荐
编写一个能有效匹配大部分邮件地址的正则表达式并不简单,因为实际的邮件地址规范相当复杂。以下是一个相对宽松但能涵盖大多数常见情况的正则表达式示例: ```java String regex = "^[\\w\\.-]+@([\\w\\-]+\\.)+[\\...
- **验证Email地址的有效性**:利用正则表达式可以精确地定义一个有效电子邮件地址的标准格式。 - **从大量文本中提取有用信息**:如从日志文件中提取关键日志记录,或者从网页中提取所需数据等。 如果不使用正则...
### 几个常用的经典正则表达式 在日常开发工作中,正则表达式是一种非常实用且强大的工具,它可以帮助我们高效地完成字符串的搜索、替换等操作。下面将详细介绍几个经典的正则表达式及其应用场景。 #### 1. 匹配...
无论是用正则表达式直接量还是用构造函数RegExp(),创建一个RegExp对象都是比较容易的.较为困难的任务是用正则表达式语法来描述字符的模式. JavaScript采用的是Perl语言正则表达式语法的一个相当完整的子集. 正则...
例如,要创建一个匹配电子邮件地址的正则表达式,你可以逐步添加规则,如检查是否有“@”符号、域名、顶级域名等,而不是一次性写出整个复杂的正则表达式。 以下是一些JavaVerbalExpressions库常用的方法和概念: ...
例如,要匹配所有邮箱地址,我们可以使用如下正则表达式: ```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,谢谢了 ...
如果不使用正则表达式,编写相应的判断逻辑可能会非常繁琐并且容易出错。使用正则表达式则可以轻松实现这些功能,只需简单的正则表达式模式即可完成验证。 在搜索和替换方面,传统的搜索替换方法需要提供确切的文字...
其中,利用正则表达式进行数据验证是一种常见而有效的方法。 #### 一、正则表达式的概念 正则表达式(Regular Expression),通常被简称为regex或regexp,是一种用于匹配字符串中字符组合的模式。通过正则表达式的...
这个函数使用了一个正则表达式来匹配常见的电子邮件地址格式。 ### 二、自定义HTML标签与JavaScript结合 #### 1. 自定义标签的概念 自定义HTML标签是HTML5引入的一个新特性,允许开发者创建自己的元素,这可以提高...
二是正则表达式的规则太难维护,源网站只要有一点点的变更,可能导致模板要重新更换。 我们从设计之初就重视并解决这个问题,采用国际标准的xml/xpath路径描述语言,在我们的系统,html自动转换为标准的xml文档。...
此外,文章提到的使用PHP自带函数进行操作的方法,主要指的就是使用filter_var函数,因为它的使用简单,不需要复杂的正则表达式编写,也不容易出错,非常适合验证邮箱、IP地址和URL等格式标准的数据。通过示例代码和...
在Java中,我们可以使用正则表达式或者Java内置的`java.util.regex.Pattern`和`java.util.regex.Matcher`类来验证邮箱地址。然而,这种方法往往比较复杂,容易出错,而且不能涵盖所有有效的邮箱格式。Jaev库提供了一...
这个函数首先定义了一个正则表达式模式来匹配电子邮件地址: ```php $pattern='/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})/i'; ``` 这个正则表达式解释如下: - `[a-zA-Z0-9._%+-]+` 匹配电子邮件用户名...
3. **正则表达式**:可以使用正则表达式来检查特定格式的输入,如电子邮件或电话号码。例如,验证邮箱格式: ```javascript var emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; if (!...
3. 正则表达式:PHP中通常使用正则表达式(Regex)来验证电子邮件地址。正则表达式是一种强大的文本匹配模式,可以用来检测字符串是否符合特定的模式。对于电子邮件验证,一个基本的正则表达式可能包括@符号、至少一...
正则表达式是用于匹配字符串模式的强大工具,可以确保输入的邮箱地址符合常见格式(如:`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`),QQ号码(通常为纯数字)也是同样的道理。 接下来,"跳转"指的是页面...
- **邮箱验证**:利用正则表达式判断输入是否符合邮箱格式,如`/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/`。 - **数字验证**:检查输入是否为整数或浮点数,可使用`isNaN`函数或正则表达式。 - **电话...
6. **安全考虑**:虽然JavaScript验证可以提高用户体验,但不应完全依赖客户端验证,因为其容易被绕过。服务器端验证仍然是必要的,以防止恶意用户提交无效或有害的数据。 从压缩包中的文件名来看,"使用帮助.txt...
以往开发者通常会使用正则表达式来进行这种验证,但编写正则表达式有时可能较为复杂,且容易出错。PHP提供了一个内置的函数`filter_var`,它可以简化这一过程,确保数据过滤和验证的准确性。 `filter_var`函数的...