正则表达式能做什么?

正则表达式可以用来搜索、编辑或处理文本。

「都懂它可以处理文本,可到底是怎么回事?」

正则表达式的定义

百度百科:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

所以正则表达式它「首先不同的语言之间的正则表达式有细微的区别」:

^[a-z0-9_-]{3,15}$就是一个标准的正则表达式,它用来检测用户注册登录名时,用户名只可以包含字符、数字、下划线和连接字符并且用户名的长度必须在3-15个字符的范围内。

  1. [...]    方括号内为匹配的规则,a-z 为匹配从 到 的字符,0-9 为匹配 0 到 9 的数字。
  2. {m,n} 正则表达式里的花括号表示:匹配前面的内容至少m次,至多n次,上图中则表示匹配用户名至少3次至多15次,限制了用户名的长度。

所以上述的正则表达式在实际应用的时候是什么样子的呢?

Java版本:

public static void main(String args[]) {
String UserName = "nicolas"; String pattern = "^[a-z0-9_-]{3,15}$";
//String pattern = "\\w{3,15}";也可以
     boolean isMatch = Pattern.matches(pattern, UserName); System.out.println("用户名是否合规? " + isMatch); }

输出结果:

用户名是否合规? true

正则表达式的实际案例

看到还不够明白?让我们来看一个应用正则表达式的题目:

LeetCode NO.38 报数

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

  1. 1
  2. 11
  3. 21
  4. 1211
  5. 111221

1 被读作  "one 1"  ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211。

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

看不懂题目的话请点击本行文字,进入leetcode评论区看一下解释

首先添加一个Java正则的语法:

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

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

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

那么不难看懂: 「    (\d)\1*    」的含义为:匹配两个连续0次以上的相同数字

前文中用到了 :

Pattern.matches(pattern, UserName);

Java来做正则表达式的时候 有两个重要的类:Matcher 和 Pattern,下面首先讲一下Matcher 和 Pattern

Matcher 和 Pattern

首先介绍一下两个类的主要作用:

  1. Pattern类的实例的主要作用是给正则表达式一个匹配模式,因为在java里面正则表达式是一个字符串,字符串的能力是非常有限的,不像javascript那样可以在正则表达式末尾添加"g" "i" "m"来指定全局匹配、区分大小写匹配和多行匹配(如"/\b\w/gi")。因此在java里面需要Pattern实例来包装正则表达式zifu字符串,然后通过Pattern实例的方法来设置·匹配模式。
  2. Matcher类的实例的作用是增加表达式匹配字符串的权利,让正则表达式更自由的匹配字符串。比如调用Matcher实例的方法,正则表达式可以匹配整个字符串、可以匹配字符串最前端的子串、最后段的子串、或者任意位置的子串等等。

下面详细介绍几个常用方法:

Pattern

  • Pattern compile(String regex)

    • 由于Pattern的构造函数是私有的,不可以直接创建,所以通过静态方法compile(String regex)方法来创建,将给定的正则表达式编译并赋予给Pattern类。
    • 例如:
    • Pattern pattern = Pattern.compile("\\?{2}");
  • Pattern.matcher(CharSequence input)
    • 对指定输入的字符串创建一个Matcher对象。Matcher对象一般通过这个方法生成。CharSequence是个interface,String类实现了CharSequence接口,因此可以传入String类型的值。
    • 例如:
    • Pattern pattern = Pattern.compile("\\?{2}");
      Matcher matcher = pattern.matcher("??");
      //matcher的matches方法是对字符串整合匹配。只有整个字符串符合正则表达式才会返回true
      boolean matches = matcher.matches();// true

Matcher

  • boolean matches()

    • 最常用方法:尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值.
  • boolean lookingAt()
    • 对前面的字符串进行匹配,只有匹配到的字符串在最前面才会返回true
  • boolean find()
    • 对字符串进行匹配,匹配到的字符串可以在任何位置

      • String group()

        • 返回匹配到的子字符串

这里match()是全匹配正则,但是本次案例里,我们只需要部分匹配就可以了

find() 部分匹配

话不多说,我们先看解题代码:

 import java.util.regex.Matcher;
import java.util.regex.Pattern; public class NO38 {
public String countAndSay(int n) {
StringBuilder sb = new StringBuilder("1");
while(--n>0){
Matcher matcher = Pattern.compile("(\\d)\\1*").matcher(sb.toString());
sb.setLength(0);//将StringBuffer清空
while(matcher.find()){ //当查找到了相应到字符串
String num = matcher.group(0);
sb.append(num.length()+num.substring(0,1));
}
}
return sb.toString();
} public static void main(String[] args) {
NO38 solution = new NO38();
String s = solution.countAndSay(5);
System.out.println(s);
}
}

第8行: 将compile和matcher连用了,其实是可以分开写的,写成:

 Pattern p = Pattern.compile("(\\d)\\1*");
Matcher m = p.matcher(sb.toString);

第9行: 每次循环开始前要把StringBuffer清空,因为每次都要将上一次的结果清空,比如n=1时,sb=1,那么n=2时需要清空前面的sb值再令sb=11,这个清空sb内容的操作就由第9行代码来完成。

第10-13行: 前面说到来  find() 是部分匹配,所以写在了while循环内,这样可以在每一次部分匹配成功时,进行一次操作。“matcher.group(0)”是将匹配到的字符串返回,然后获取这个字符串的长度,再进行一次拼接,完成操作

结束语:

正则表达式的简单操作就是这样,后面一些进阶的内容待我以后慢慢完善。

「this page is for my "xxx"」

正则表达式从入门到放弃「Java」的更多相关文章

  1. 编程从入门到放弃(Java)

      1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利 ...

  2. Java从入门到放弃——01.Java 环境搭建

    本文目标: 下载与安装JDK 配置Java环境 1.JDK9下载:  下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jav ...

  3. Uni-app原生插件入门使用教程「2」:如何离线使用原生插件

    当HBuilderX中提供的能力无法满足App功能需求,需要通过使用Andorid/iOS原生开发实现时,可使用App离线SDK开发原生插件来扩展原生能力. 如使用Uniapp开发直播功能时,需要调用 ...

  4. 「JAVA」:Berkeley DB的JAVA连接

    Berkeley DB是一个嵌入式的数据库,它适合于管理海量的.简单的数据.关键字/数据(key/value)是Berkeley DB用来进行数据管理的基础.每个key/value构成了一条记录,而整 ...

  5. 「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指南」一份涵盖大 ...

  6. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

  7. jvm系列(十):如何优化Java GC「译」

    本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...

  8. [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world

    [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world 原文链接:http://www.cnblogs.com/blog5277/ ...

  9. Java的参数传递是「按值传递」还是「按引用传递」?

    JAVA传递的只有值,.传递的都是栈里的的值,只是有些栈里面的是值.有的是内存地址.(原文传递的都是栈里的的值有误,局部变量在栈中,成员变量在堆中,类变量(静态变量和常量)在方法区中,可以看做本文的变 ...

随机推荐

  1. python学习第四十五天__name__用法和作用

    在python导入模块导入另外一个模块的时候,有时候只是想用其一个方法,会出现其他的方法也运行了,python用到__name__==‘__main__’ 解决问题,那么__name__用法和作用 1 ...

  2. IE, Chrome和Firefox浏览器 差异对比

    最近的项目中使用Extjs5.6, 其中主要的一个特点就是js文件的动态加载,之前使用Firefox浏览器对js文件进行调试,打断点时,只对当次调试有效,刷新之后,由于动态加载的js文件(文件名后面加 ...

  3. wxpython程序基本功能源码整理,包括基本文字,输入框,字体设置,按钮绑定事件触发

    #coding=utf-8 import wx class MyApp(wx.App): def __init__(self): wx.App.__init__(self) def OnInit(se ...

  4. js中基本数据类型与引用数据类型的本质区别

    代码 /** * 基本数据类型:string, number, boolean, null, undefined. * * 说明: * 基本数据类型的变量是保存在栈内存中的,基本数据类型的值 * 直接 ...

  5. [书接上一回]在Oracle Enterprise Linux (v5.7) 中安装DB - (3/4)

    安装p10404530_112030_Linux-x86-64_6of7.zip解压下的example. 修改软件路径,为dbhome_1. 安装好数据,则可以进行快照操作! 删除安装文件. 输入db ...

  6. 通过busybox制作根文件系统

    通过busybox制作根文件系统可以自定义选项,在制作的根文件系统中添加需要的命令,指定生成的根文件系统到相应的目录下. 一. 根文件系统的获取方式--->官网: https://busybox ...

  7. Linux性能优化从入门到实战:14 文件系统篇:Linux 文件系统基础

      磁盘为系统提供了最基本的持久化存储.   文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构. 文件系统:索引节点和目录项   文件系统是对存储设备上的文件,进行组织管理的机制.组织方式不 ...

  8. debian系列systemd 配置nodejs服务

    1  新建service配置文件 vi /etc/systemd/system/node.service [Unit] Description=My super nodejs app [Service ...

  9. [web 安全] php随机数安全问题

    and() 和 mt_rand() 产生随机数srand() 和 mt_srand() 播种随机数种子(seed)使用: <?php srand(123);//播种随机数种子 for($i=0; ...

  10. 编译原理--NFA/DFA

    现成的, 讲义: https://www.cnblogs.com/AndyEvans/p/10240790.html https://www.cnblogs.com/AndyEvans/p/10241 ...