正则表达式之环视(java)

下面我所写的都是参考自精通正则表达式(第三版).

什么是环视

环视顾名思义就是从四周看。正则表达式一向都是从左向右工作的,但是环视也能从右向左工作。最典型的列子就是给你一个数字如

12345678,需要你改成12,345,678这种格式。如果按照我们的思维来,应该是会从右边开始划分吧,每三个数字加一个逗号。环视就能按照我们的思维去解决这样的问题。这里要注意的是环视不匹配任何字符,只是匹配位置而已。作用和^,&相似。环视又分为顺序环视和逆序环视。也就是从左到右工作和从右到左的区别.顺序环视在正则中用(?=)表示,包含括号。逆序用(?<=)

我们来举个简单的列子来解释顺序和逆序环视的作用。比如给定一个字符串”hellowld”我们想在”ld”前面插入一个”or”字符。下面是简单的java实现。

         String strTest = "hellowld";
        Pattern pattern = Pattern.compile("(?=ld)");
        Matcher matcher = pattern.matcher(strTest);
        System.out.printf(matcher.replaceAll("or"));

这段代码中真正匹配到的字符串是”ld”,所谓的顺序环视就是在匹配这个字符串前的那个位置。

相信大家现在应该能够推测出逆序环视了吧。匹配的是ld后面那个位置。

环视的例子

理解了上诉环视的列子我们来解决一开始那个问题。我们可以先分析一下,需要满足这样的条件。左边要是数字,右边的数字个数是3的倍数。

接下来就是对这个条件所实现的java代码。

         String str = "12345678";
        Pattern pattern = Pattern.compile("(?<=\\d)(?=(\\d{3})+$)");
        Matcher matcher = pattern.matcher(str);
        System.out.printf(matcher.replaceAll(","));

(?<=\\d)这个表达式满足了左边是数字,可以想象一下。因为逆序环视是匹配字符串右边的位置,也就是\d右边的位置。那不就是说明了这个位置的左边是\d吗。对(?=(\\d{3})+$)的理解可能有点不太容易。如果是孤立的(\\d{3})+$匹配的是从字符串末尾向左数字的个数正好是3的倍数。但是加入顺序环视之后意义就不一样了它能匹配右边数字的个数正好是3的倍数的位置。$是关键,没有了这个符号,也就意味着可以不是从最后一个数字开始匹配的。这里可以结合程序好好的想想。这样两个条件就都满足了。也就能够匹配到正确的位置了。

但是如果给的字符串不一定是纯数字,可能是”12345678$”这样的形式,上诉的正则就不管用了。在这里我再引入两个概念就是否定顺序环视(?!)和否定逆序环视(?<!)。

在(?=表达式)中,意味表达式能够匹配右侧的文本,而(?!表达式)则以为表达式不能匹配右侧的文本。那么可以将正则改成

"(?<=\\d)(?=(\\d{3})+(?!\\d))"也许你认为可以将(?!\\d)改成\D,但是这两个其实是有区别的,\D是匹配一个非数字的字符,也就是说必须匹配一个字符。如果给你的数字是"12345678"这样就不能得到匹配了.
时间: 2024-10-27 21:37:18

正则表达式之环视(java)的相关文章

正则表达式的环视和匹配

环视 环视匹配的最终结果就是一个位置,有四种类型的环视: (?=Expression) 顺序肯定环视,表示所在位置右侧能够匹配Expression (?!Expression) 顺序否定环视,表示所在位置右侧不能匹配Expression (?<=Expression) 逆序肯定环视,表示所在位置左侧能够匹配Expression (?<!Expression) 逆序否定环视,表示所在位置左侧不能匹配Expression 可以用以下两个正则表达式理解环视: (1)字母.数字.特殊符号全部出现,至少

正则表达式基础及java使用

正则表达式基础 正则表达式语法(1) 普通字符:字母,数字,汉子,下划线以及没有特殊定义的标点符号都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符 简单的转义字符: \n :代表换行符 \t :代表制表符 \\ :代表\本身 \^ ......  :代表匹配这字符本身 正则表达式语法(2) 标准字符集合: 能够与多种字符匹配的表达式 注意区分大小写,大写是相反的意思 \d :任意一个数字,0-9中的任意一个 \w:任意一个字母或者下划线或者汉字,也就

正则表达式的环视

环视的英文叫做lookaround,这是在"精通正则表达式"一书中的叫法.在不同的书籍跟文档中,它又被叫做"断言","前视","预搜索"等.环视分为以下几种. 顺序肯定环视.表示所在位置右侧能够匹配Expression.在python中为string(?=Expression),在vim中为/string\(Expression\)\@= 顺序否定环视.表示所在位置右侧能够匹配Expression.在python中为strin

[正则表达式]PCRE环视功能

设想一下这个问题,假设为了方便长串数字的阅读性,需要为其添加逗号作为分隔,需要怎么做呢? 2569836495 => 2,569,836,495 正则表达式的匹配通常是从左往右的,这导致无法使用类似[\d]{3}这样的方法去解决问题,因为数字是从右边结算的 用s/([\d]{3})/$1,/g处理上面的数字,只会得到这样的结果 2569836495 => 256,983,649,5 显然这是错误的标记方法 幸好PCRE提供了[顺序环视],和[逆序环视]功能 [顺序环视]:(?=REG),例如(

正则表达式(以Java语言为例)

正则表达式的概念: 用来匹配和处理文本的字符串.人们常用模式(pattern)来表示实际的正则表达式.正则表达式是由正则表达式语言创建的.正则表达式语言是内置于其他语言或软件产品里的"迷你"语言,但它并不是一种完备的程序设计语言.不同的编程语言或应用程序里,正则表达式的语法和功能会有所不同. 正则表达式的用途: (1)搜索(匹配):在一个字符串中搜索出一个或多个与正则表达式相匹配的子字符串.搜索又分为匹配和子字符串搜索.匹配是对用户所提供的整个字符串进行判断,看其是否匹配正则表达式,比

js 正则表达式之环视结构

一.环视 1:环视不"占用"字符,只匹配字符所在的特定位置. 2:正则表达式是从左向右进行匹配的. 二.肯定顺序环视(?=....) 子表达式匹配当前位置的右侧字符 图中:红色表示当前位置,绿色表示正则匹配,黄色表示断言匹配 (1):起始位为0 (2):从左向右查看文本,如果当前位置字符与表达式2匹配成功,就查看右侧文本是否满足断言条件,当条件1与条件2都成立时就匹配成功. 三.肯定逆向环视(?<=...) 子表达式匹配当前位置的左侧字符 图中:红色表示当前位置,绿色表示正则匹配

剑指Offer52:正则表达式匹配(Java)

参考: 左程云进阶算法第8节视频内容(2小时18分钟处) 视频百度网盘:链接:https://pan.baidu.com/s/1beVfli8bmH9obwNW3NT3Kg 提取码:q5bi loveforever个人博客网站:https://zhenganwen.top/posts/310d4836/ (有左神算法基础,进阶视频完整笔记代码) 思路分析: 递归版本大概听懂了,动态规划的解法听不懂.看不懂这个题的网上解析的博客不妨看看左神的视频. 递归解法有两个关键点: 递归解法以函数f(i,j

JAVA 正则表达式 (超详细)

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

Java 正则表达式详解

摘自:http://www.jb51.net/article/16829.htm 许多语言,包括 Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替 换”功能.那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification Request)已经得到认可,你可以期待在JDK的下一版本中看到它. 然而,如果现在就需要使用正则表达式,又该怎么办呢?你可以从Ap