iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中正则表达式匹配过程实例详解
  • 913
分享到

Java中正则表达式匹配过程实例详解

2024-04-02 19:04:59 913人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录下面是Java正则表达式的语法字符:正则表达式简单的匹配过程:(1) 基础匹配过程(2)贪婪模式(3)非贪婪模式 (4)零宽度匹配过程总结正则表达式:定义字符串的模式,

正则表达式:定义字符串的模式,用来对字符串进行搜索、编辑或处理文本。

目前的正则表达式引擎大体上可分为不同的两类:DFA和NFA,而NFA又基本上可以分为传统型NFA和POSIX NFA。

DFA Deterministic finite automaton 确定型有穷自动机

NFA Non-deterministic finite automaton 非确定型有穷自动机

Java使用的是传统型NFA引擎。

下面是Java正则表达式的语法字符:

\

将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n匹配字符 n。\n 匹配换行符。序列 \\\\ 匹配 \\ ,\\( 匹配 (。

^

匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。

$

匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。

*

零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。

+

一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。

?

零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。

{n}

n 是非负整数。正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。

{n,}

n 是非负整数。至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有 o。"o{1,}"等效于"o+"。"o{0,}"等效于"o*"。

{n,m}

m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。

?

当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"。

.

匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。

(pattern)

匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用""或者""或者""。

(?:pattern)

匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。

(?=pattern)

执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

(?!pattern)

执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

x|y

匹配 x 或 y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。

[xyz]

字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。

[^xyz]

反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。

[a-z]

字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。

[^a-z]

反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符。

\b

匹配一个字边界,即字与空格间的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。

\B

非字边界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。

\cx

匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是"c"字符本身。

\d

数字字符匹配。等效于 [0-9]。

\D

非数字字符匹配。等效于 [^0-9]。

\f

换页符匹配。等效于 \x0c 和 \cL。

\n

换行符匹配。等效于 \x0a 和 \cJ。

\r

匹配一个回车符。等效于 \x0d 和 \cM。

\s

匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。

\S

匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。

\t

制表符匹配。与 \x09 和 \cI 等效。

\v

垂直制表符匹配。与 \x0b 和 \cK 等效。

\w

匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。

\W

与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。

\xn

匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,"\x41"匹配"A"。"\x041"与"\x04"&"1"等效。允许在正则表达式中使用 ASCII 代码。

\num

匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。

\n

标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。

\nm

标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 \nm 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。

\nml

当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。

\un

匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。

正则的匹配过程,通常情况下都是由一个子表达式(可能为一个普通字符、元字符或元字符序列组成)取得控制权,从字符串的某一位置开始尝试匹配,一个子表达式开始尝试匹配的位置,是从前一子表达匹配成功的结束位置开始的。如果匹配到字符串某一位置时整个表达式匹配失败,那么引擎会使正则向前传动,整个表达式从下一位开始重新尝试匹配,依此类推,直到报告匹配成功或尝试到最后一个位置后报告匹配失败。

正则表达式简单的匹配过程:

 代码为pattern为正则表达式对content进行匹配

(1) 基础匹配过程

    public static void main(String[] args) {
        String content = "abc";
 
        String pattern = "abc";
        System.out.println(content.matches(pattern));
    }

匹配过程:       

        首先由字符“a”取得控制权,由“a”来匹配“a”,匹配成功,控制权交给字符“b”;由于“a”已被“a”匹配,所以“b”从位置1开始尝试匹配,由“b”来匹配“b”,匹配成功,控制权交给“c”;由“c”来匹配“c”,匹配成功放回true。

(2)贪婪模式

    public static void main(String[] args) {
        String content = "abc";
 
        String pattern = "ab?c";
        System.out.println(content.matches(pattern));
    }

        量词“?”属于匹配优先量词,在可匹配可不匹配时,会先选择尝试匹配,只有这种选择会使整个表达式无法匹配成功时,才会尝试让出匹配到的内容。这里的量词“?”是用来修饰字符“b”的,所以“b?”是一个整体。

匹配过程:

        首先由字符“a”取得控制权,由“a”来匹配“a”,匹配成功,控制权交给字符“b?”;由于“?”是匹配优先量词,所以会先尝试进行匹配,由“b?”来匹配“b”,匹配成功,控制权交给“c”,同时记录一个备选状态;由“c”来匹配“c”,匹配成功。记录的备选状态丢弃。

    public static void main(String[] args) {
        String content = "abd";
 
        String pattern = "ab?c";
        System.out.println(content.matches(pattern));
    }

匹配过程:

        首先由字符“a”取得控制权,,由“a”来匹配“a”,匹配成功,控制权交给字符“b?”;先尝试进行匹配,由“b?”来匹配“b”,同时记录一个备选状态,匹配成功,控制权交给“c”;由“c”来匹配“d”,匹配失败,此时进行回溯,找到记录的备选状态,“b?”忽略匹配,即“b?”不匹配“b”,让出控制权,把控制权交给“c”;由“c”来匹配“b”,匹配失败。此时第一轮匹配尝试失败。

正则引擎使正则向前传动,由位置1开始尝试匹配,由“a”来匹配“b”,匹配失败,没有备选状态,第二轮匹配尝试失败。

继续向前传动,直到所有尝试匹配失败,匹配结束。此时报告整个表达式匹配失败。

(3)非贪婪模式 

    public static void main(String[] args) {
        String content = "abc";
 
        String pattern = "ab??c";
        System.out.println(content.matches(pattern));
    }

        量词“??”属于忽略优先量词,在可匹配可不匹配时,会先选择不匹配,只有这种选择会使整个表达式无法匹配成功时,才会尝试进行匹配。这里的量词“??”是用来修饰字符“b”的,所以“b??”是一个整体。

匹配过程:

        首先由字符“a”取得控制权,由“a”来匹配“a”,匹配成功,控制权交给字符“b??”;先尝试忽略匹配,即“b??”不进行匹配,同时记录一个备选状态,控制权交给“c”;由“c”来匹配“b”,匹配失败,此时进行回溯,找到记录的备选状态,“b??”尝试匹配,即“b??”来匹配“b”,匹配成功,把控制权交给“c”;由“c”来匹配“c”,匹配成功。

(4)零宽度匹配过程

        所谓零宽断言,简单来说就是匹配一个位置,这个位置满足某个正则,但是不纳入匹配结果的,所以叫“零宽”,而且这个位置的前面或后面需要满足某种正则。

    public static void main(String[] args) {
        String content = "abc";
 
        String pattern = "^(?=[a-z])[a-z0-9]+$";
        System.out.println(content.matches(pattern));
    }

        元字符“^”和“$”匹配的只是位置,顺序环视“(?=[a-z])”只进行匹配,并不占有字符,也不将匹配的内容保存到最终的匹配结果,所以都是零宽度的。

        这个正则的意义就是匹配由字母或数字组成的,第一个字符是字母的字符串。

匹配过程:

        首先由元字符“^”取得控制权,从开始位置开始匹配,匹配成功,控制权交给顺序环视“(?=[a-z])”;

“(?=[a-z])”要求它所在位置右侧必须是字母才能匹配成功,零宽度的子表达式之间是不互斥的,即同一个位置可以同时由多个零宽度子表达式匹配,所以它也是从开始位置尝试进行匹配,开始位置的右侧是字符“a”,符合要求,匹配成功,控制权交给“[a-z0-9]+”;

因为“(?=[a-z])”只进行匹配,并不将匹配到的内容保存到最后结果,并且“(?=[a-z])”匹配成功的位置是开始位置,所以“[a-z0-9]+”也是从开始位置开始尝试匹配的,“[a-z0-9]+”首先尝试匹配“a”,匹配成功,继续尝试匹配,可以成功匹配接下来的“b”和“c”,此时右侧已没有字符,这时会把控制权交给“$”;“$”成功匹配结束符,匹配成功。

总结

到此这篇关于Java中正则表达式匹配过程的文章就介绍到这了,更多相关Java正则匹配过程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中正则表达式匹配过程实例详解

本文链接: https://www.lsjlt.com/news/169049.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中正则表达式匹配过程实例详解
    目录下面是Java正则表达式的语法字符:正则表达式简单的匹配过程:(1) 基础匹配过程(2)贪婪模式(3)非贪婪模式 (4)零宽度匹配过程总结正则表达式:定义字符串的模式,...
    99+
    2022-11-13
  • Python中使用正则表达式及正则表达式匹配规则详解
    目录1 导库2 使用模板3 说明4 示例5 正则表达式匹配规则1 导库 import re 2 使用模板 re_pattern = re.compile(pattern, flags...
    99+
    2023-03-22
    Python正则表达式匹配规则 Python正则表达式
  • 正则表达式之字符串模式匹配实例详解
    目录前言什么是正则表达式字符范围匹配元字符多次重复匹配定位匹配贪婪模式与非贪婪模式表达式分组结语前言 今天我们来学习正则表达式,正则表达式的应用十分广泛,几乎每个涉及到交互的项目都会...
    99+
    2022-11-13
  • java正则表达式匹配规则超详细总结
    目录1 单个字符的匹配规则如下:2 多个字符的匹配规则如下:3 复杂匹配规则主要有:4 提取匹配的字符串子段5 非贪婪匹配6 替换和搜索6.1 分割字符串6.2 搜索字符串6.3 替...
    99+
    2022-11-13
  • MySQL正则表达式匹配查询(含实例)
    目录一、正则表达式介绍二、使用正则表达式测试数据1.基本字符匹配2.OR匹配3.模糊匹配4.匹配范围5.匹配特殊字符6. 匹配字符类7.匹配多个实例8.定位符总结一、正则表达式介绍 ...
    99+
    2022-11-13
  • Python正则表达式以及常用匹配实例
    目录1 正则表达式对象2 正则表达式修饰符 - 可选标志3 正则表达式字符意义re.match函数re.search方法替换re.subre.compile 函数findallre....
    99+
    2022-11-11
  • Oracle 正则表达式实例详解
    Oracle 正则表达式实例详解 FORM开发中的按行拆分需求:拆分后的行要有规律,并按前后层次排序   需求分析如下:      现有行: 2 ...
    99+
    2022-10-18
  • jmeter正则表达式实例详解
    过年前产假归来,jmeter很多知识生疏了,这两天打开jmeter摸索了几下,老了记不住,还是准备弄个jmeter系列随笔吧。 言归正传,使用jmeter时经常有这样的情况:一个完整...
    99+
    2022-11-12
  • Python正则表达式匹配中文用法示例
    本文实例讲述了Python正则表达式匹配中文用法。分享给大家供大家参考,具体如下: #!/usr/bin/python #-*- coding:cp936-*-#思路,将str转换成unicode,方可...
    99+
    2022-06-04
    示例 中文 正则表达式
  • Java正则表达式之Pattern类实例详解
    目录前言Pattern 概述Pattern 匹配模式(Pattern flags)代码示例多行模式:Pattern.MULTILINE 示例忽略大小写:Pattern.CASE_IN...
    99+
    2022-11-12
  • 正则表达式匹配ip地址超详细讲解
    IP地址是一个由32位二进制数字组成的地址,为了方便表示和理解,通常将其表示为四个以`.`分隔的十进制数。正则表达式可以用来匹配IP...
    99+
    2023-08-09
    正则表达式
  • grep正则表达式匹配中括号的方法实例
    目录1. 匹配中括号,例如匹配 String[] args2. 匹配大括号,例如匹配 {abc 123}3. 同时匹配中括号和大括号,例如匹配 new byte[]{6, 55, 7...
    99+
    2022-11-13
  • Java正则表达式API边界匹配怎么实现
    本篇内容主要讲解“Java正则表达式API边界匹配怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java正则表达式API边界匹配怎么实现”吧!Boundary MatchersJava ...
    99+
    2023-07-02
  • Shell脚本中通过正则表达式匹配IP地址
    在运维场景下,我们经常需要在服务器上用正则表达式来匹配IP地址。 shell和其它编程语言一样,也可以使用正则分组捕获,不过不能使用 $1或1这样的形式来捕获分组,可以通过数组${BASH_REMATCH}...
    99+
    2022-06-04
    脚本 地址 正则表达式
  • python正则表达式中匹配次数与贪心问题详解(+ ?*)
    python中正则表达式中的匹配次数问题网上有很多解释,最多的就是*匹配0或者无数次,+匹配1次或无数次,?匹配0次或者1次。可是虽然这个文字描述很简单,但是真正用起来的时候大家有没...
    99+
    2022-11-11
  • 在Java中正则表达式匹配不到结果如何解决
    这篇文章主要介绍了在Java中正则表达式匹配不到结果如何解决,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和...
    99+
    2023-06-06
  • 在Java中使用正则表达式匹配${key}的方法
    这篇文章将为大家详细讲解有关在Java中使用正则表达式匹配${key}的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.正则表达式匹配${key}\$\{([a-z]+)\} 能够匹配字符串中以${...
    99+
    2023-06-07
  • python如何使用re.DEBUG查看正则表达式的匹配过程
    这篇文章主要介绍了python如何使用re.DEBUG查看正则表达式的匹配过程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用re.DEB...
    99+
    2022-10-19
  • VBS中正则表达式如何实现字符匹配
    这篇文章主要介绍了VBS中正则表达式如何实现字符匹配,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。字符匹配句点 (.) 匹配一个字符串中任何单个的打印或非打印字符,除了换行符...
    99+
    2023-06-09
  • JAVA正则表达式匹配多个空格的解决方案
    目录需求解决方案扩充知识()和[]有本质的区别java中,正则表达式匹配一个或多个空格 && 正则表达式匹配两个或多个空格正则表达式匹配多个空格需求 针对tab键带来...
    99+
    2022-11-16
    java正则表达式匹配空格 正则表达式匹配空格 正则表达式匹配多个空格
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作