java 正则表达式简介

项目开发中,多次用到正则表达式,先简单总结一下:

参考文章:http://www.blogjava.net/lbx19822004/archive/2007/05/28/120423.html(认为的重点已标注)

一、什么是正则表达式

 正则表达式是一种可以用于模式匹配和替换的强有力的工具。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。此外,像JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。

   正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,进行信息的验证。此外,它还能够高效地创建、比较和修改字符串,以及迅速地分析大量文本和数据以搜索、移除和替换文本。

二、基础知识

  1.1     开始、结束符号(它们同时也属于定位符)

    我们先从简单的开始。假设你要写一个正则表达式规则,你会用到 ^ 和 $ 符号,他们分别是行首符、行尾符。

    例:/^\d+[0-9]?\d+$/

  1.2 句点符号

    假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。这样,完整的表达式就是“t.n”,它匹      配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:

  1.3 方括号符号

    为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:

  1.4 “符号

    如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。

  1.5 表示匹配次数的符号

    表一:显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:

 
代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

    表二:常用符号

代码/语法 相当于
\w [0-9A-Za-z_]
\W [^0-9A-Za-z_]
\s [\t\n\r\f]
\S [^\t\n\r\f]
\d [0-9]
\D [^0-9]

  表二中的符号意义:

  ·         \w

    包括下划线的字母和数字。等同于[0-9A-Za-z_]。若为匹配多字节字符的正则表达式时,则也会匹配日语的全角字符。

  ·         \W

    非字母和数字。\w以外的单个字符。

  ·         \s

    空字符。相当于[ \t\n\r\f]

  ·         \S

    非空字符。[ \t\n\r\f] 以外的单个字符。

  ·         \d

    数字。即[0-9]

  ·         \D

    非数字。\d以外的单个字符

  1.6 定位符介绍(用于规定匹配模式在目标对象中的出现位置)

    较为常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,\b定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,而“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说: 
    /^hell/ 
      因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或 “hellhound”开头的字符串相匹配。 
    /ar$/ 
      因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。 
    /\bbom/ 
      因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。 
    /man\b/ 
      因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。 
    /[A-Z]/ 
      上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。 
    /[a-z]/ 
      上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。 
    /[0-9]/ 
      上述正则表达式将会与从0到9范围内任何一个数字相匹配。 
    /([a-z][A-Z][0-9])+/ 
      上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。 
    如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如: 
    /to|too|2/ 
      上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。 
    正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。与我们前文所介绍的定位符 “^” 不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如: 
    /[^A-C]/ 
      上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。 
    最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如: 
    /Th\*/ 
    上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。

三、正则表达式规则的例子

  /^(\d{3}-|\d{4}-)?(\d{8}|\d{7})?$/    //国内电话 
  /^[1-9]*[1-9][0-9]*$/    //腾讯QQ 
  /^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$/    //email地址 
  /^[a-zA-Z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\s*)?$/  //url 
  /^\d+$/   //非负整数 
  /^[0-9]*[1-9][0-9]*$/  //正整数 
  /^((-\\d+)|(0+))$/  //非正整数 
  /^-[0-9]*[1-9][0-9]*$/  //负整数 
  /^-?\\d+$/     //整数 
  /^\\d+(\\.\\d+)?$/  //非负浮点数 
  /^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$/  //正浮点数 
  /^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$/  //非正浮点数 
  /^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/ //负浮点数 
  /^(-?\\d+)(\\.\\d+)?$/  //浮点数 
  /^[a-zA-Z]+$/  //由26个英文字母组成的字符串 
  /^[a-z]+$/  //由26个英文字母的大写组成的字符串 
  /^[a-z]+$/  //由26个英文字母的小写组成的字符串 
  /^[a-za-z0-9]+$/  //由数字和26个英文字母组成的字符串 
  /^\\w+$/  //由数字、26个英文字母或者下划线组成的字符串

  /^\d+[.]?\d+$/    //可以有小数点的任意多数字(全部为数字)

  /(?=^[0-9a-zA-Z]{4,20}$)\w*[a-zA-Z]+\w*/   //同时满足下面三个条件

  (1)数字和字母  (2)4-20位  (3)不能全部是数字

四、应用(原创)

   (1)提取"数字与字母"组合的字符串中的数字,并修改为纯数字,127.00010ddd修改为127.0001ddd

  程序:

    

public void replaceString(){
		String string = "177.0000000dddd";
		if (null == string || string.isEmpty()) {
			System.out.println("字符串为空");
			return;
		}
		String outputString = null;

		String regex = "([.]\\d+)";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(string);
		if(matcher.find()){
			String numberString = matcher.group();
			System.out.println("find .number---->" + numberString);
			String tmpString = numberString.replaceAll("([.]0*$)|(0*$)","" );
			outputString = string.replace(numberString, tmpString);
		} else {
			outputString = string;
		}
		System.out.println("output string----->" + outputString);
	}

(2)路由核心处理器ip的判断:

  

public boolean ipIsRight(String ipAddress){
		String test = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\/"+"(2[0-4]|1[0-9]|[1-9])$";
		Pattern pattern = Pattern.compile(test);
		Matcher matcher = pattern.matcher(ipAddress);
		return matcher.matches();

  

  

时间: 2024-11-05 12:28:05

java 正则表达式简介的相关文章

Java正则表达式初学者使用法简介

在Java中使用正则表达式的方法非常多,最简单的就是和字符串一起使用.对于Java正则表达式初学者,在String中有四个方法可以使用正则表达式,本文正是介绍这四个方法来使用正则表达式来处理文本数据. 本文将介绍如何在Java中使用正则表达式来处理文本数据.正则表达式就是一个字符串,但和普通的字符串不同的是,正则表达式是对一组相似字符串的抽象,如下面的几个字符串: a98b c0912d c10b a12345678d ab 我们仔细分析上面五个字符串,可以看出它们有一个共同特征,就是第一个字符

JAVA 正则表达式 (超详细)

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

刨根究底正则表达式之一——正则表达式简介

声明: 本系列文章的主要参考书有: <精通正则表达式>英文版及中文版 作者: Jeffrey E·F·Friedl 译者:余晟 电子工业出版社 2012-07 <正则指引>作者:余晟 电子工业出版社 2012-05 <正则表达式必知必会>作者:Ben Forta 译者:杨涛 人民邮电出版社2015-01 <冒号课堂:编程范式与OOP思想>作者:郑晖 电子工业出版社 2009-10 同时,还参考了网上的大量资料,除了少部分资料由于未作大量修改(但基本上也有少量

正则表达式简介

初次接触正则表达式的读者除了感觉它有些繁琐外,还会有一种深不可测的感觉.其实正则表达式就是描述字符排列模式的一种自定义的语法规则,在PHP给我们提供的系统函数中,使用这种模式对字符串进行匹配.查找.替换及分割等操作.它的应用非常广泛.例如,常见的使用正则表达式去验证用户在表单中提交的用户名.密码.E-mail地址.身份证号码及电话号码等格式是否合法:在用户发布文章时,将输入有URL的地方全部加上对应的连接:按所有标点符号计算文章中一共有多少个句子:抓取网页中某种格式的数据等.正则表达式并不是PH

聊聊 Java 正则表达式 StackOverflowError 问题及其优化

正则可以看做一门 DSL,但它却应用极其广泛,可以轻松解决很多场景下的字符串匹配.筛选问题.同时呢有句老话: " 如果你有一个问题,用正则表达式解决,那么你现在就有两个问题了." Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. 今天我们就来聊聊 Java 正则表达式 StackO

Java正则表达式详解

本文为转载文章,因为实在写的太好了,所以就拿过来使用了 在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式.正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性.在Unix世界里,正则表达式几乎没有什么限制,可肯定的是,它应用非常之广泛. 正则表达式的引擎已被许多普通的Unix工具所实现,包括gr

JAVA正则表达式 Pattern和Matcher

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它包括两个类:Pattern和Matcher . Pattern: 一个Pattern是一个正则表达式经编译后的表现模式. Matcher: 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类

【转】java正则表达式

在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式.正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性.在Unix世界里,正则表达式几乎没有什么限制,可肯定的是,它应用非常之广泛. 正则表达式的引擎已被许多普通的Unix工具所实现,包括grep,awk,vi和Emacs等.此外,许多使用比较广泛

Java正则表达式基础整理

(一)正则表达式及语法简介 String类使用正则表达式的几个方法: 正则表达式支持的合法字符: 特殊字符: 预定义字符: 方括号表达式: 圆括号表达式:用于将多个表达式组成一个子表达式,可以使用或运算符“|”,比如正则表达式:"(aa|bb|cc)"就表示匹配"aa"."bb"."cc"三个字符串中的其中一个. 边界匹配符: 贪婪.勉强.占有模式的数量标识符: (二)Java正则表达式的简单用法 两个关键类:(1)Patte