Java正则表达式教程及示例

本文由 ImportNew - ImportNew读者 翻译自 journaldev。欢迎加入翻译小组。转载请见文末要求。

【感谢 @CuGBabyBeaR  的热心翻译。如果其他朋友也有不错的原创或译文,可以尝试投递到 ImportNew。】

当我开始我的Java职业生涯的时候,对于我来说正则表达式简直是个是梦魇。本教程旨在帮助你驾驭Java正则表达式,同时也帮助我复习正则表达式。

什么是正则表达式?

正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。Java正则表达式和Perl的是最为相似的。

Java正则表达式的类在 java.util.regex 包中,包括三个类:Pattern,Matcher 和 PatternSyntaxException。

  1. Pattern对象是正则表达式的已编译版本。他没有任何公共构造器,我们通过传递一个正则表达式参数给公共静态方法 compile 来创建一个pattern对象。
  2. Matcher是用来匹配输入字符串和创建的 pattern 对象的正则引擎对象。这个类没有任何公共构造器,我们用patten对象的matcher方法,使用输入字符串作为参数来获得一个Matcher对象。然后使用matches方法,通过返回的布尔值判断输入字符串是否与正则匹配。
  3. 如果正则表达式语法不正确将抛出PatternSyntaxException异常。

让我们在一个简单的例子里看看这些类是怎么用的吧


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

package com.journaldev.util;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexExamples {

    public static void main(String[] args) {

        // using pattern with flags

        Pattern pattern = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);

        Matcher matcher = pattern.matcher("ABcabdAb");

        // using Matcher find(), group(), start() and end() methods

        while (matcher.find()) {

            System.out.println("Found the text \"" + matcher.group()

                    + "\" starting at " + matcher.start()

                    + " index and ending at index " + matcher.end());

        }

        // using Pattern split() method

        pattern = Pattern.compile("\\W");

        String[] words = pattern.split("[email protected]#three:four$five");

        for (String s : words) {

            System.out.println("Split using Pattern.split(): " + s);

        }

        // using Matcher.replaceFirst() and replaceAll() methods

        pattern = Pattern.compile("1*2");

        matcher = pattern.matcher("11234512678");

        System.out.println("Using replaceAll: " + matcher.replaceAll("_"));

        System.out.println("Using replaceFirst: " + matcher.replaceFirst("_"));

    }

}

上述程序的输出是:

Input String matches regex - true
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character ‘*‘ near index 0
*xx*
^
	at java.util.regex.Pattern.error(Pattern.java:1924)
	at java.util.regex.Pattern.sequence(Pattern.java:2090)
	at java.util.regex.Pattern.expr(Pattern.java:1964)
	at java.util.regex.Pattern.compile(Pattern.java:1665)
	at java.util.regex.Pattern.(Pattern.java:1337)
	at java.util.regex.Pattern.compile(Pattern.java:1022)
	at com.journaldev.util.PatternExample.main(PatternExample.java:13)

既然正则表达式总是和字符串有关, Java 1.4对String类进行了扩展,提供了一个matches方法来匹配pattern。在方法内部使用Pattern和Matcher类来处理这些东西,但显然这样减少了代码的行数。

Pattern类同样有matches方法,可以让正则和作为参数输入的字符串匹配,输出布尔值结果。

下述的代码可以将输入字符串和正则表达式进行匹配。


1

2

3

String str = "bbb";

System.out.println("Using String matches method: "+str.matches(".bb"));

System.out.println("Using Pattern matches method: "+Pattern.matches(".bb", str));

所以如果你的需要仅仅是检查输入字符串是否和pattern匹配,你可以通过调用String的matches方法省下时间。只有当你需要操作输入字符串或者重用pattern的时候,你才需要使用Pattern和Matches类。

注意由正则定义的pattern是从左至右应用的,一旦一个原字符在一次匹配中使用过了,将不会再次使用。

例如,正则“121”只会匹配两次字符串“31212142121″,就像这样“_121____121″。

正则表达式通用匹配符号


正则表达式


说明


示例


.


Matches any single sign, includes everything

匹配任何单个符号,包括所有字符


(“..”, “a%”) – true(“..”, “.a”) – true

(“..”, “a”) – false


^xxx


在开头匹配正则xxx


(“^a.c.”, “abcd”) – true(“^a”, “a”) – true

(“^a”, “ac”) – false


xxx$


在结尾匹配正则xxx


(“..cd$”, “abcd”) – true(“a$”, “a”) – true

(“a$”, “aca”) – false


[abc]


能够匹配字母a,b或c。[]被称为character classes。


(“^[abc]d.”, “ad9″) – true(“[ab].d$”, “bad”) – true

(“[ab]x”, “cx”) – false


[abc][12]


能够匹配由1或2跟着的a,b或c


(“[ab][12].”, “a2#”) – true(“[ab]..[12]“, “acd2″) – true

(“[ab][12]“, “c2″) – false


[^abc]


当^是[]中的第一个字符时代表取反,匹配除了a,b或c之外的任意字符。


(“[^ab][^12].”, “c3#”) – true(“[^ab]..[^12]“, “xcd3″) – true

(“[^ab][^12]“, “c2″) – false


[a-e1-8]


匹配a到e或者1到8之间的字符


(“[a-e1-3].”, “d#”) – true(“[a-e1-3]“, “2″) – true

(“[a-e1-3]“, “f2″) – false


xx|yy


匹配正则xx或者yy


(“x.|y”, “xa”) – true(“x.|y”, “y”) – true

(“x.|y”, “yz”) – false

Java正则表达式元字符


正则表达式


说明


\d


任意数字,等同于[0-9]


\D


任意非数字,等同于[^0-9]


\s


任意空白字符,等同于[\t\n\x0B\f\r]


\S


任意非空白字符,等同于[^\s]


\w


任意英文字符,等同于[a-zA-Z_0-9]


\W


任意非英文字符,等同于[^\w]


\b


单词边界


\B


非单词边界

有两种方法可以在正则表达式中像一般字符一样使用元字符。

  1. 在元字符前添加反斜杠(\)
  2. 将元字符置于\Q(开始引用)和\E(结束引用)间

正则表达式量词

量词指定了字符匹配的发生次数。


正则表达式


说明


x?


x没有出现或者只出现一次


X*


X出现0次或更多


X+


X出现1次或更多


X{n}


X正好出现n次


X{n,}


X出席n次或更多


X{n,m}


X出现至少n次但不多于m次

量词可以和character classes和capturing group一起使用。

例如,[abc]+表示a,b或c出现一次或者多次。

(abc)+表示capturing group “abc”出现一次或多次。我们即将讨论capturing group。

正则表达式capturing group

Capturing group是用来对付作为一个整体出现的多个字符。你可以通过使用()来建立一个group。输入字符串中和capturing group相匹配的部分将保存在内存里,并且可以通过使用Backreference调用。

你可以使用matcher.groupCount方法来获得一个正则pattern中capturing groups的数目。例如((a)(bc))包含3个capturing groups; ((a)(bc)), (a) 和 (bc)。

你可以使用在正则表达式中使用Backreference,一个反斜杠(\)接要调用的group号码。

Capturing groups和Backreferences可能很令人困惑,所以我们通过一个例子来理解。


1

2

3

4

System.out.println(Pattern.matches("(\\w\\d)\\1", "a2a2")); //true

    System.out.println(Pattern.matches("(\\w\\d)\\1", "a2b2")); //false

    System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B2AB")); //true

    System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B3AB")); //false

在第一个例子里,运行的时候第一个capturing group是(\w\d),在和输入字符串“a2a2″匹配的时候获取“a2″并保存到内存里。因此\1是”a2”的引用,并且返回true。基于相同的原因,第二行代码打印false。

试着自己理解第三行和第四行代码。:)

现在我们来看看Pattern和Matcher类中一些重要的方法。

我们可以创建一个带有标志的Pattern对象。例如Pattern.CASE_INSENSITIVE可以进行大小写不敏感的匹配。Pattern类同样提供了和String类相似的split(String) 方法

Pattern类toString()方法返回被编译成这个pattern的正则表达式字符串。

Matcher类有start()end()索引方法,他们可以显示从输入字符串中匹配到的准确位置。

Matcher类同样提供了字符串操作方法replaceAll(String replacement)replaceFirst(String replacement)

现在我们在一个简单的java类中看看这些函数是怎么用的。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

package com.journaldev.util;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexExamples {

    public static void main(String[] args) {

        // using pattern with flags

        Pattern pattern = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);

        Matcher matcher = pattern.matcher("ABcabdAb");

        // using Matcher find(), group(), start() and end() methods

        while (matcher.find()) {

            System.out.println("Found the text \"" + matcher.group()

                    + "\" starting at " + matcher.start()

                    + " index and ending at index " + matcher.end());

        }

        // using Pattern split() method

        pattern = Pattern.compile("\\W");

        String[] words = pattern.split("[email protected]#three:four$five");

        for (String s : words) {

            System.out.println("Split using Pattern.split(): " + s);

        }

        // using Matcher.replaceFirst() and replaceAll() methods

        pattern = Pattern.compile("1*2");

        matcher = pattern.matcher("11234512678");

        System.out.println("Using replaceAll: " + matcher.replaceAll("_"));

        System.out.println("Using replaceFirst: " + matcher.replaceFirst("_"));

    }

}

上述程序的输出:


1

2

3

4

5

6

7

8

9

10

Found the text "AB" starting at 0 index and ending at index 2

Found the text "ab" starting at 3 index and ending at index 5

Found the text "Ab" starting at 6 index and ending at index 8

Split using Pattern.split(): one

Split using Pattern.split(): two

Split using Pattern.split(): three

Split using Pattern.split(): four

Split using Pattern.split(): five

Using replaceAll: _345_678

Using replaceFirst: _34512678

原文链接: journaldev 翻译: ImportNew.comImportNew读者
译文链接: http://www.importnew.com/6810.html

时间: 2024-12-27 14:13:51

Java正则表达式教程及示例的相关文章

【转】C#正则表达式教程和示例

[转]C#正则表达式教程和示例 有一段时间,正则表达式学习很火热很潮流,当时在CSDN一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的<C#字符串和正则表达式参考手册>学习了一些基础的知识,同时也为我在CSDN大概赚了1000分,今天想起来,去找<C#字符串和正则表达式参考手册>时,已经不知所踪了.现在用到正则的时候也比较少,把以前的笔记等整理一下,以志不忘. (1)"@"符号符下两ows表研究室的火热,当晨在"@&q

C#正则表达式教程和示例

有一段时间,正则表达式学习很火热很潮流,当时在CSDN一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的<C#字符串和正则表达式参考手册>学习了一些基础的知识,同时也为我在CSDN大概赚了1000分,今天想起来,去找<C#字符串和正则表达式参考手册>时,已经不知所踪了.现在用到正则的时候也比较少,把以前的笔记等整理一下,以志不忘. (1)“@”符号符下两ows表研究室的火热,当晨在“@”虽然并非C#正则表达式的“成员”,但是它经常与C#正则表达式出双

Java正则表达式的模式匹配示例

package date0804.demo1; import java.util.regex.Pattern; public class RegularExpres { public static void main(String[] args) { //中括号只代表一位字符,*代表任意位,问号代表一位 //匹配首字母为a,末尾字母为b的任意字符串 boolean b1 = Pattern.matches("a*d", "aaaaad"); //匹配首字母为a,末尾

(转)Java正则表达式的语法与示例

转自:http://www.cnblogs.com/lzq198754/p/5780340.html 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 2在字符串中查询字符或者字符串 3常用正则表达式 4正则表达式语法 1匹配验证-验证Email是否正确 Java | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public static void main(String[] args) {     // 要验证的字符串     

Java正则表达式实用教程

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.java.util.regex包主要包括以下三个类:Pattern.Matcher和PatternSyntaxException. 一个Pattern是一个正则表达式经编译后的表现模式. 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误. 首先一个Patte

Java注解教程:自定义注解示例,利用反射进行解析

Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解. 注解是Java 1.5引入的,目前已被广泛应用于各种Java框架,如Hibernate,Jersey,Spring.注解相当于是一种嵌入在程序中的元数据,可以使用注解解析工具或编译器对其进行解析,也可以指定注解在编译期或运行期有效. 在注解诞生之前,程序的元数据存在的形式仅限于java注释或javadoc,但注解可以提供更多

JAVA 正则表达式 (超详细)

(PS:这篇文章为转载,我不喜欢转载的但我觉得这篇文章实在是超赞了,就转了过来,这篇可以说是学习JAVA正则表达的必读篇.作者是个正真有功力的人,阅读愉快) 在Sun的JavaJDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式.正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性.在Unix世界里,正则表达式几乎没有

Java 正则表达式(精华)

英文:Jakob Jenkov译文:严亮链接:ifeve.com/java-regex/ Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索出现的模式.例如,你可以用正则表达式搜索网页中的邮箱地址或超链接. 正则表达式示例 下面是一个简单的Java正则表达式的例子,用于在文本中搜索 http:// String text = "This is th

java 正则表达式语法

java 正则表达式语法 标签: 正则表达式javawindowsvbscriptscripting电话 2012-05-20 10:11 6705人阅读 评论(1) 收藏 举报  分类: javaSe(16)  目录(?)[+] 本文目标 如何使用本教程 正则表达式到底是什么? 入门 测试正则表达式 元字符 字符转义 重复 字符类 反义 替换 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处理选项 平衡组/递归匹配 还有些什么东西没提到 联系作者 最后,来点广告… 一些我认为你可能