`
aerchi
  • 浏览: 425559 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
文章分类
社区版块
存档分类
最新评论

java.util.regex.Pattern类使用

 
阅读更多

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 类的实例用于此目的则不安全。 非捕获组

正则表达式的构造摘要

构造 匹配 字符字符类预定义字符类POSIX 字符类(仅 US-ASCII)java.lang.Character 类(简单的java 字符类型)Unicode 块和类别的类边界匹配器Greedy 数量词Reluctant 数量词Possessive 数量词Logical 运算符Back 引用引用特殊构造(非捕获)
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] abc(简单类)
[^abc] 任何字符,除了abc(否定)
[a-zA-Z] azAZ,两头的字母包括在内(范围)
[a-d[m-p]] admp[a-dm-p](并集)
[a-z&&[def]] def(交集)
[a-z&&[^bc]] az,除了bc[ad-z](减去)
[a-z&&[^m-p]] az,而非mp[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]
\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]
\p{javaLowerCase} 等效于 java.lang.Character.isLowerCase()
\p{javaUpperCase} 等效于 java.lang.Character.isUpperCase()
\p{javaWhitespace} 等效于 java.lang.Character.isWhitespace()
\p{javaMirrored} 等效于 java.lang.Character.isMirrored()
\p{InGreek} Greek 块(简单)中的字符
\p{Lu} 大写字母(简单类别
\p{Sc} 货币符号
\P{InGreek} 所有字符,Greek 块中的除外(否定)
[\p{L}&&[^\p{Lu}]] 所有字母,大写字母除外(减去)
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好n
X{n,} X,至少n
X{n,m} X,至少n次,但是不超过m
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好n
X{n,}? X,至少n
X{n,m}? X,至少n次,但是不超过m
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好n
X{n,}+ X,至少n
X{n,m}+ X,至少n次,但是不超过m
XY X后跟Y
X|Y XY
(X) X,作为捕获组
\n 任何匹配的nth捕获组
\ Nothing,但是引用以下字符
\Q Nothing,但是引用所有字符,直到\E
\E Nothing,但是结束从\Q开始的引用
(?:X) X,作为非捕获组
(?idmsux-idmsux) Nothing,但是将匹配标志idmsuxon - off
(?idmsux-idmsux:X) X,作为带有给定标志idmsuxon - off
(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(?<=X) X,通过零宽度的正 lookbehind
(?<!X) X,通过零宽度的负 lookbehind
(?>X) X,作为独立的非捕获组

反斜线、转义和引用

反斜线字符 ('\') 用于引用转义构造,如上表所定义的,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式 \\ 与单个反斜线匹配,而 \{ 与左括号匹配。

在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。

根据

字符类

字符类可以出现在其他字符类中,并且可以包含并集运算符(隐式)和交集运算符 (&&)。并集运算符表示至少包含其某个操作数类中所有字符的类。交集运算符表示包含同时位于其两个操作数类中所有字符的类。

字符类运算符的优先级如下所示,按从最高到最低的顺序排列:

1 2 3 4 5
字面值转义 \x
分组 [...]
范围 a-z
并集 [a-e][i-u]
交集 [a-z&&[aeiou]]

注意,元字符的不同集合实际上位于字符类的内部,而非字符类的外部。例如,正则表达式 . 在字符类内部就失去了其特殊意义,而表达式 - 变成了形成元字符的范围。

行结束符

行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符:

  • 新行(换行)符 ('\n')、
  • 后面紧跟新行符的回车符 ("\r\n")、
  • 单独的回车符 ('\r')、
  • 下一行字符 ('\u0085')、
  • 行分隔符 ('\u2028') 或
  • 段落分隔符 ('\u2029)。

如果激活

如果未指定

默认情况下,正则表达式 ^$ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配。如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配。处于 MULTILINE 模式中时,$ 仅在行结束符之前或输入序列的结尾处匹配。 Unicode Technical Standard #18:Unicode Regular Expression Guidelines 第 1 级和 RL2.1 Canonical Equivalents。

组和捕获

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:

1 2 3 4
((A)(B(C)))
\A
(B(C))
(C)

组零始终代表整个表达式。

之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器获取。

与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串 "aba" 与表达式 (a(b)?)+ 相匹配,会将第二组设置为 "b"。在每个匹配的开头,所有捕获的输入都会被丢弃。

(?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。

Unicode 支持

此类符合

Java 源代码中的 Unicode 转义序列(如 \u2014)是按照 Java Language Specification 的 第 3.3 节中的描述处理的。这样的转义序列还可以由正则表达式解析器直接实现,以便在从文件或键盘击键读取的表达式中使用 Unicode 转义。因此,可以将不相等的字符串 "\u2014""\\u2014" 编译为相同的模式,从而与带有十六进制值 0x2014 的字符匹配。 Character 类指定版本中的 The Unicode Standard 的类别。类别名称是在 Standard 中定义的,即标准又丰富。Pattern 所支持的块名称是 UnicodeBlock.forName 所接受和定义的有效块名称。 上文所述。

与 Perl 中一样,Unicode 块和类别是使用 \p\P 构造编写的。如果输入具有属性 prop,则与 \p{prop} 匹配,而输入具有该属性时与 \P{prop} 不匹配。块使用前缀 In 指定,与在 InMongolian 中一样。可以使用可选前缀 Is 指定类别:\p{L}\p{IsL} 都表示 Unicode 字母的类别。块和类别在字符类的内部和外部都可以使用。

受支持的类别是由

行为类似 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 数量词,它可以尽可能多地进行匹配,即使这样做导致所有匹配都成功时也如此。

  • 字符类并集和交集,如

Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"UNIX_LINES 模式,则新行符是唯一识别的行结束符。 DOTALL 标志,则正则表达式 . 可以与任何字符(行结束符除外)匹配。

分享到:
评论

相关推荐

    java 正则表达试

    jakarta-oro.jar 及代码 import org.apache.oro.text.regex.MalformedPatternException; import org.apache.oro.text.regex.MatchResult; import org.apache.oro.text.regex...import org.apache.oro.text.regex.Util;

    pattern-dissector:探索 java.util.regex.Pattern 类的内部结构

    探索 Java 正则表达式语法的更多细节,并了解Pattern类中的引擎如何实际解释正则表达式。 不是通过文档(通过合同)推断正则表达式的含义,这允许我们直接验证引擎如何解释正则表达式。 自该项目开始(2014 年 2 ...

    article-regex-primer.rar_The Few

    Java Regex Primer Since version 1.4, Java has had support for Regular Expressions in the core API.... Pattern. Reading this text in conjunction with the javadoc of those classes is advised.

    i18n Tools helper

    import java.util.regex.Pattern; /** * . &lt;p/&gt; @author George Wei */ public class I18nTool { private static final String TEMP_RES_ENCODING = "gbk"; private static final String TEMP_RES_FILE = "D:/...

    java统计字符串出现次数算法--StringCounter(算法源码)

    Pattern expression = Pattern.compile(regex); Matcher matcher = expression.matcher(source); TreeMap, Integer&gt; myTreeMap = new TreeMap, Integer&gt;(); int n = 0; Object word = null; Object num ...

    计算器代吗

    import java.util.regex.Pattern; import com.android.xiong.gridlayoutTest.R.id; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; ...

    java解析给定url

    import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 现在要求用Java编写一个程序,该程序访问上面的URL,并从页面中, * 提取出上图所示位置的页面信息(仅图中所要求的内容),将其内容按...

    JAVA正则表达式--Pattern和Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个...

    Java正则表达式使用

    一:抓取网页中的Email地址 利用正则表达式匹配网页中的文本 代码如下: [\\w[.-]]+@[\\w[.-]]+\\.[\\w]+ 将网页内容分割提取 ...import java.util.regex.Pattern; public class EmailSpider { p

    Java JDK正则表达

    一、概述  正则表达式是Java处理字符串、文本的重要工具。  Java对正则表达式的处理集中在以下两... java.util.regex.Pattern 匹配类:用模式匹配一个字符串所表达的抽象结果。  (新版的Java Doc有解释。)

    refactoring-cases:重构案例

    重构案例此示例展示了如何将提取后...import java.util.regex.Pattern;abstract class SymbolReplacer { protected String stringToReplace; protected List alreadyReplaced = new ArrayList(); SymbolReplacer(Strin

    Android下保存简单网页到本地(包括简单图片链接转换)实现代码

    最近在做一个项目涉及到将包含图片的简单网页下载到本地,方便离线时观看,在这里分享一下,大家做下简单修改就可以用到自己的项目中了。...import java.util.regex.Pattern; import android.content.ContentValues;

    正则表达式大全案例分析案例介绍

    在Java中,正则表达式的相关类都位于java.util.regex包中。 下面是一些Java中常用的正则表达式语法和使用方法: 匹配字符串模式: 使用String类的matches()方法,可以判断一个字符串是否与某个正则表达式匹配。 ...

    java课堂作业:用二维数组存储五个学生姓名学号,并用正则表达式判断输入数据是否有误。输出按学号排序的学生。

    输入5个同学的学号和姓名(格式:“姓-名”),存储在二维数组中检查输入同学学号和姓名的格式...import java.util.regex.Pattern; import org.hamcrest.Matcher; main函数 public static void main(String[] args){

    android frameworks src code

    import java.util.regex.Pattern; import java.util.regex.Matcher; /** * Listens for events from the wpa_supplicant server, and passes them on * to the {@link WifiStateTracker} for handling. Runs in ...

    小工具

    import java.util.regex.Pattern; import java.util.*; import java.text.*; import java.io.*; import java.net.*; * * --------------------自动程序-------------------- * * 将要测试的id填写入16行的变量...

    Java用正则对字符串进行处理并判断是否能转为数字

    import java.util.regex.Pattern; /** * @author: gznc_pcc * @date:2018年6月1日 10:50:38 * @version : * */ class Main { public static void main(String[] args) { String lineString = [\1\]; String ...

    精通正则表达式~~~

    使用java.util.regex. 371 The Pattern.compile() Factory. 372 Pattern的matcher方法... 373 Matcher对象... 373 应用正则表达式... 375 查询匹配结果... 376 简单查找-替换... 378 高级查找-替换... 380 ...

    Java 正则表达式学习总结和一些小例子

    从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础工具,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容. java.util.regex是一个用正则表达式所订制的模式来对字符串进行...

    Java正则表达式学习笔记

    1. Java的正则表达式介绍jdk软件包中java.util.regex中,接口MatchResult,类Matcher和类Pattern。  MatchResult:此接口包含用于确定与正则表达式匹配结果的查询方法。通过 MatchResult可以查看匹配边界、组和组...

Global site tag (gtag.js) - Google Analytics