转自
http://www.blogjava.net/heiyuchuanxia/archive/2006/11/18/81974.html
字符串验证--java.util.regex.Pattern
今天修改了jsf的验证器部分...看到了对于email的验证.....看起来还是有点头大呀.....于是乎翻javadoc....找到了java.util.regex.Pattern类....挺有意思的...一起分享一下......
java.util.regex
类 Pattern
java.lang.Objectjava.util.regex.Pattern
所有已实现的接口:
Serializable
public final class Pattern
extends Object
implements Serializable
正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches("a*b", "aaaaab");
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。
正则表达式的构造摘要
构造 匹配
字符
x 字符 x
\\ 反斜线字符
\0n 带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 带有十六进制值 0x 的字符 hh
\uhhhh 带有十六进制值 0x 的字符 hhhh
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
\e 转义符 ('\u001B')
\cx 对应于 x 的控制符
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
POSIX 字符类(仅 US-ASCII)
\p{Lower} 小写字母字符:[a-z]
\p{Upper} 大写字母字符:[A-Z]
\p{ASCII} 所有 ASCII:[\x00-\x7F]
\p{Alpha} 字母字符:[\p{Lower}\p{Upper}]
\p{Digit} 十进制数字:[0-9]
\p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}]
\p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} 可见字符:[\p{Alnum}\p{Punct}]
\p{Print} 可打印字符:[\p{Graph}\x20]
\p{Blank} 空格或制表符:[ \t]
\p{Cntrl} 控制字符:[\x00-\x1F\x7F]
\p{XDigit} 十六进制数字:[0-9a-fA-F]
\p{Space} 空白字符:[ \t\n\x0B\f\r]
java.lang.Character 类(简单的 java 字符类型)
\p{javaLowerCase} 等效于 java.lang.Character.isLowerCase()
\p{javaUpperCase} 等效于 java.lang.Character.isUpperCase()
\p{javaWhitespace} 等效于 java.lang.Character.isWhitespace()
\p{javaMirrored} 等效于 java.lang.Character.isMirrored()
Unicode 块和类别的类
\p{InGreek} Greek 块(简单块)中的字符
\p{Lu} 大写字母(简单类别)
\p{Sc} 货币符号
\P{InGreek} 所有字符,Greek 块中的除外(否定)
[\p{L}&&[^\p{Lu}]] 所有字母,大写字母除外(减去)
边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次
Logical 运算符
XY X 后跟 Y
X|Y X 或 Y
(X) X,作为捕获组
Back 引用
\n 任何匹配的 nth捕获组
引用
\ Nothing,但是引用以下字符
\Q Nothing,但是引用所有字符,直到 \E
\E Nothing,但是结束从 \Q 开始的引用
特殊构造(非捕获)
(?:X) X,作为非捕获组
(?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off
(?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组
(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(?<=X) X,通过零宽度的正 lookbehind
(?<!X) X,通过零宽度的负 lookbehind
(?>X) X,作为独立的非捕获组
反斜线、转义和引用
反斜线字符 ('\') 用于引用转义构造,如上表所定义的,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式 \\ 与单个反斜线匹配,而 \{ 与左括号匹配。
在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。
根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。
字符类
字符类可以出现在其他字符类中,并且可以包含并集运算符(隐式)和交集运算符 (&&)。并集运算符表示至少包含其某个操作数类中所有字符的类。交集运算符表示包含同时位于其两个操作数类中所有字符的类。
字符类运算符的优先级如下所示,按从最高到最低的顺序排列:
1 字面值转义 \x
2 分组 [...]
3 范围 a-z
4 并集 [a-e][i-u]
5 交集 [a-z&&[aeiou]]
注意,元字符的不同集合实际上位于字符类的内部,而非字符类的外部。例如,正则表达式 . 在字符类内部就失去了其特殊意义,而表达式 - 变成了形成元字符的范围。
行结束符
行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符:
* 新行(换行)符 ('\n')、
* 后面紧跟新行符的回车符 ("\r\n")、
* 单独的回车符 ('\r')、
* 下一行字符 ('\u0085')、
* 行分隔符 ('\u2028') 或
* 段落分隔符 ('\u2029)。
如果激活 UNIX_LINES 模式,则新行符是惟一识别的行结束符。
如果未指定 DOTALL 标志,则正则表达式 . 可以与任何字符(行结束符除外)匹配。
默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配。如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配。处于 MULTILINE 模式中时,$ 仅在行结束符之前或输入序列的结尾处匹配。
组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。
之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。
与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串 "aba" 与表达式 (a(b)?)+ 相匹配,会将第二组设置为 "b"。在每个匹配的开头,所有捕获的输入都会被丢弃。
以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。
Unicode 支持
此类符合 Unicode Technical Standard #18:Unicode Regular Expression Guidelines 第 1 级和 RL2.1 Canonical Equivalents。
Java 源代码中的 Unicode 转义序列(如 \u2014)是按照 Java Language Specification 的 第 3.3 节中的描述处理的。这样的转义序列还可以由正则表达式分析器直接实现,以便在从文件或键盘击键读取的表达式中使用 Unicode 转义。因此,可以将不相等的字符串 "\u2014" 和 "\\u2014" 编译为相同的模式,从而与带有十六进制值 0x2014 的字符匹配。
与 Perl 中一样,Unicode 块和类别是使用 \p 和 \P 构造编写的。如果输入具有属性 prop,则与 \p{prop} 匹配,而输入具有该属性时与 \P{prop} 不匹配。块使用前缀 In 指定,与在 InMongolian 中一样。可以使用可选前缀 Is 指定类别:\p{L} 和 \p{IsL} 都表示 Unicode 字母的类别。块和类别在字符类的内部和外部都可以使用。
受支持的类别是由 Character 类指定版本中的 The Unicode Standard 的类别。类别名称是在 Standard 中定义的,即标准又丰富。Pattern 所支持的块名称是 UnicodeBlock.forName 所接受和定义的有效块名称。
行为类似 java.lang.Character boolean 是 methodname 方法(废弃的类别除外)的类别,可以通过相同的 \p{prop} 语法来提供,其中指定的属性具有名称 javamethodname。
与 Perl 5 相比较
Pattern 引擎用有序替换项执行传统上基于 NFA 的匹配,与 Perl 5 中进行的相同。
此类不支持 Perl 构造:
*
条件构造 (?{X}) 和 (?(condition)X|Y)、
*
嵌入式代码构造 (?{code}) 和 (??{code})、
*
嵌入式注释语法 (?#comment) 和
*
预处理操作 \l\u、\L 和 \U。
此类支持但 Perl 不支持的构造:
*
Possessive 数量词,它可以尽可能多地进行匹配,即使这样做导致所有匹配都成功时也如此。
*
字符类并集和交集,如上文所述。
与 Perl 的显著不同点是:
*
在 Perl 中,\1 到 \9 始终被解释为 Back 引用;如果至少存在多个子表达式,则大于 9 的反斜线转义数按 Back 引用对待,否则在可能的情况下,它将被解释为八进制转义。在此类中,八进制转义必须始终以零开头。在此类中,\1 到 \9 始终被解释为 Back 引用,较大的数被接受为 Back 引用,如果在正则表达式中至少存在多个子表达式的话;否则,分析器将删除数字,直到该数小于或等于组的现有数或者其为一个数字。
*
Perl 使用 g 标志请求恢复最后匹配丢失的匹配。此功能是由 Matcher 类显式提供的:重复执行 find 方法调用可以恢复丢失的最后匹配,除非匹配器被重置。
*
在 Perl 中,位于表达式顶级的嵌入式标记对整个表达式都有影响。在此类中,嵌入式标志始终在它们出现的时候才起作用,不管它们位于顶级还是组中;在后一种情况下,与在 Perl 中类似,标志在组的结尾处还原。
*
Perl 允许错误匹配构造,如在表达式 *a 中,以及不匹配的括号,如在在表达式 abc] 中,并将其作为字面值对待。此类还接受不匹配的括号,但对 +、? 和 * 不匹配元字符有严格限制;如果遇到它们,则抛出 PatternSyntaxException。
有关正则表达式构造行为更准确的描述,请参见《Mastering Regular Expressions, 2nd Edition》,该书由 Jeffrey E. F. Friedl、O'Reilly 和 Associates 合著,于 2002 年出版。
从以下版本开始:
1.4
另请参见:
String.split(String, int), String.split(String), 序列化表格
字段摘要
static int CANON_EQ
启用规范等价。
static int CASE_INSENSITIVE
启用不区分大小写的匹配。
static int COMMENTS
模式中允许空白和注释。
static int DOTALL
启用 dotall 模式。
static int LITERAL
启用模式的字面值分析。
static int MULTILINE
启用多行模式。
static int UNICODE_CASE
启用 Unicode 感知的大小写折叠。
static int UNIX_LINES
启用 Unix 行模式。
方法摘要
static Pattern compile(String regex)
将给定的正则表达式编译到模式中。
static Pattern compile(String regex, int flags)
将给定的正则表达式编译到具有给定标志的模式中。
int flags()
返回此模式的匹配标志。
Matcher matcher(CharSequence input)
创建匹配给定输入与此模式的匹配器。
static boolean matches(String regex, CharSequence input)
编译给定正则表达式并尝试将给定输入与其匹配。
String pattern()
返回在其中编译过此模式的正则表达式。
static String quote(String s)
返回指定 String 的字面值模式 String。
String[] split(CharSequence input)
围绕此模式的匹配拆分给定输入序列。
String[] split(CharSequence input, int limit)
围绕此模式的匹配拆分给定输入序列。
String toString()
返回此模式的字符串表示形式。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
这样下来检验email的代码也是相当简单呀....
boolean b = Pattern.matches("^\\w+@\\w+(\\.\\w+)+", email);
分享到:
相关推荐
`regex-smart.jar`这个库显然是为了简化开发者在Java项目中使用正则表达式的流程,它提供了一系列内置的验证、提取和清洗方法,使得处理字符串变得更加高效和便捷。 首先,让我们了解一下正则表达式的基础概念。...
在Java中,`java.util.regex` 包提供了Pattern和Matcher类来处理正则表达式。然而,对于生成符合正则表达式的字符串,标准库并不提供直接支持。这时,我们可以引入第三方库,如`org.pcollections.Xeger` 和 `...
- `java.util.regex.Pattern` 和 `java.util.regex.Matcher` 支持正则表达式匹配和操作。 6. **网络工具类**: - `java.net.URL` 和 `java.net.URLConnection` 用于处理网络连接和资源获取。 - `java.net.Socket...
使用Jakarta ORO时,开发者可以通过创建`Pattern`对象,预编译正则表达式,然后使用`Matcher`对象在目标字符串上执行匹配、查找、替换等操作。例如: ```java import org.apache.oro.text.regex.*; Pattern pat = ...
### Java正则表达式替换字符串详解 #### 一、引言 在Java编程语言中,正则表达式是一种强大的文本处理工具,它可以帮助开发者轻松地完成字符串搜索、替换等任务。本文将详细介绍如何使用Java正则表达式进行字符串...
3. **编译模式**:创建一个`Pattern`对象,使用`Pattern.compile()`方法编译正则表达式字符串。 4. **匹配与查找**:使用`Matcher`对象的`matches()`或`find()`方法进行匹配和查找操作。 5. **替换操作**:如果...
import java.util.regex.Pattern; public class StringCounter { /** * 正则统计字符串出现次数 * * @param source * @param regexNew * @return int */ public static int finder(String source, ...
在Java中,`java.util.regex`包提供了支持正则表达式的类库,主要包括`Pattern`、`Matcher`和`PatternSyntaxException`等几个核心类。 #### 二、基础语法 1. **字符匹配**: - `.`:匹配任意单个字符。 - `\d`:...
在Java编程中,将文本内容中的符合URL格式的字符串转换为超链接是一项常见的需求,特别是在处理用户生成内容或网络爬虫应用中。本教程将详细讲解如何使用Java实现这一功能,主要涉及URL正则表达式匹配和字符串处理...
在Java中,我们可以使用`java.util.regex`包中的`Pattern`和`Matcher`类来匹配和操作符合特定模式的字符串。对于提取括号内的内容,一个简单的正则表达式可以是`\((.*?)\)`,它匹配一对括号,并用`.*?`非贪婪地捕获...
Java中的正则表达式支持是通过`java.util.regex`包提供的,主要包括`Pattern`、`Matcher`和`PatternSyntaxException`三个核心类。`Pattern`类用于编译正则表达式并创建模式,`Matcher`类则负责匹配这些模式到目标...
Java提供了`java.util.regex`包,包含了Pattern和Matcher类来支持正则表达式的编译和匹配操作。理解如何构建和使用正则表达式对于数据验证、文本提取等场景至关重要。 2. **Java基础(javaBasic1.md、javaBasic2.md...
- `java.util.regex`:这个包提供了正则表达式相关的工具类,如`Pattern`和`Matcher`,用于进行复杂的字符串匹配和替换。 2. **文件处理**: - `java.io`包:包含了各种I/O流的类,如`File`用于文件和目录的操作...
Java 中提供了两个正则表达式类:Pattern 和 Matcher,位于 java.util.regex 包中。Pattern 类用于表示正则表达式的模式,提供了多种方法,如编译正则表达式、匹配字符串等。Matcher 类用于匹配字符串,提供了多种...
这个包包含`Pattern`、`Matcher`等类,允许开发者进行字符串的查找、替换、分割等操作。 设计模式是解决软件设计中常见问题的模板,如单例模式、工厂模式和观察者模式等。Java API中的许多类和接口都体现了这些设计...
- `Pattern.compile(regex)`编译正则表达式为模式对象,`Matcher`对象通过`Pattern`对象的`matcher(String input)`方法与输入字符串关联。 - 常用的正则表达式方法有`matches()`、`find()`、`replaceAll(String ...
- `java.util.regex`:正则表达式处理,如`Pattern`和`Matcher`,用于复杂文本匹配和替换。 4. **集合操作**: - `java.util.ArrayList`、`LinkedList`、`HashSet`、`HashMap`等:这些是Java集合框架的基础,提供...
在实际开发中,Java正则表达式广泛应用于数据验证(如邮箱、电话号码格式检查)、文本处理(如提取关键词、替换特定格式的字符串)等领域。熟练掌握Java正则表达式,能够提高代码的效率和可读性,是每个Java开发者...
- `Pattern.compile(String regex)`:这是编译正则表达式的基本方法,将字符串转换为`Pattern`对象。 - `Pattern.flags(int flags)`:可以设置一些标志,例如忽略大小写(`CASE_INSENSITIVE`)或多行模式(`...
- `java.util.regex.Pattern`:虽然在本示例中未使用,但可用于日期验证等场景。 - `org.apache.commons.logging.Log`:日志接口,用于记录程序运行时的信息。 ### 2. 定义日期格式 示例代码中定义了多个常用的...