`

(八) 正则表达式

阅读更多

正则表达式(regular expression)用于指定字符串的模式
(1)字符类(character class)是一个括在括号中的可选字符集,例如,[Jj]、[0-9]、[A-Za-z]或[^0-9]。这里"-"是表示范围,而"^"表示补集(除了指定字符之外的所有字符)
(2)预定的字符类,例如\d(数字)和\p{Sc}(Unicode货币符号)
(3)大部分字符都可以与它们自身匹配
(4)"."符合可以匹配任何字符
(5)使用"\"作为转义字符,例如,"\."匹配句号而"\\"匹配反斜线
(6)"^"和"$"分别匹配一行的开头和结尾
(7)如果X和Y是正则表达式,那么XY表示"任何X匹配后面跟随着Y的匹配",X|Y表示"任何X或Y的匹配"
(8)可以将量词运用到表达式X : X+(1个或多个)、X*(0或多个)和X?(0个或1个)
(9)一般情况下,量词要匹配能够使整个匹配成功的最大可能的重复次数。可以修改这种行为使用后缀?(最小匹配次数)或使用+(即使整个匹配失败,也要匹配最大的重复次数)
(10)使用群组来定义子表达式,其中群组使用括号()号括起来,例如([+-]?)([0-9]+)

正则表达式的最简单用法就是测试某个特定的字符串是否与它匹配。
e.g.使用Java来编写测试,首先用表示正则表达式的字符串创建一个Pattern对象,然后从这个模式中获得一个Matcher,并调用它的matcher方法
    Pattern pattern = Pattern.compile(patternString)
    Matcher matcher = pattern.matcher(input)
    if(matcher.matcher()){...}
这个匹配器的输入可以是任何实现了CharSequence接口的类的对象,例如String、StringBuilder和CharBuffer
e.g.在编译这个模式时,可以设置一个或多个标志
    Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);
支持的六个标示
(1)CASE_INSENSITIVE : 匹配字符时忽略字母的大小写。默认情况下,只考虑USASCII字符。
(2)UNICODE_CASE : 当于CASE_INSENSITIVE组合时,用Unicode字符大小写来匹配。
(3)MULTILINE : ^和$匹配行的开头和结尾,而不是整个输入的开头和结尾。
(4)UNIX_LINES : 在多行模式中匹配^和$时,只有'\n'被识别成行终止符。
(5)DOTALL : 当使用这个标志时,"."符合匹配所有字符,包括行终止符。
(6)CANON_EQ : 考虑Unicode字符规范的等价性,例如,u后面跟随''(分音符号)匹配u上面两点。

如果正则表达式包含群组,那么Matcher对象可以揭示群组的边界 : int start(int groupIndex) 和 int end(int groupIndex) 将产生指定群组的开始索引和结束之后的索引。
可以直接抽取匹配的字符串 : String group(int groupIndex)
群组0是整个输入,而用于第一个实际群组的群组索引是1。调用groupCount可以获得全部群组的数量。
嵌套群组是按照前括号排序的,例如((1?[0-9]):(0-5)[0-9])[ap]m和11:59am
匹配器会报告的群组:
群组索引    开始  结束  字符串
      0             0       7       11:59am
      1             0       5       11:59
      2             0       2       11
      3             3       5       59

 

						正则表达式语法
        	语法                                          解释
字符        
    c                                               字符c
    \unnn,\xnn,\0n,\0nnn            			具有给定十六进制或十进制的码元
    \t,\n,\r,\f,\a,\e                          	控制符:制表符、换行符、回车符、换行符、警告符、逃逸符
    \Cc                                         与字符c相关的控制符
字符类
    [C1C2...]                                   任何由C1、C2...表示的字符,其中C1可以是多个字符,字符范围(c1-c2)和字符类
    [^...]                                      字符集的补集
    [...&&...]                                 	两个字符集的交集
预定义字符类
    \d                                          一个数字[0-9]
    \D                                          一个非数字[^0-9]
    \s                                          一个空白字符[\t\n\r\f\x0B]
    \S                                          一个非空白字符
    \w                                          一个词语字符[a-zA-Z]
    \W                                          一个非词语字符
    \p[name]                                	一个命名字符类
    \P[name]                                	一个非命名字符类
边界匹配符
    ^ $                               			输入的开头和结尾(或者在多行模式下行的开头和结尾)
    \b                       					一个词语边界
    \B                           				一个非词语边界
    \A                                   		输入的开头
    \z                                  		输入的结尾
    \Z                                   		除了行终止符之外的输入结尾
    \G                                   		前一个匹配的结尾

量词
    X?                                          可选的X   
    X*                                          X,0或多次
    X+                                         	X,1或多次
    X{n} X{n,} X{n,m}                  			X为n次,至少n次,在n到m次之间
量词后缀
    ?                                        	勉强匹配
    +                                           占有匹配
集合操作
    XY                                          任何X中的字符串,后面跟随任何Y中的字符串
    X|Y                                         任何X中或Y中的字符串
群组
    (X)                                         捕获将X作为群组匹配的字符串
    \n                                          第n个群组的匹配
转义
    \c                                          字符c(必须是不在字母表中的字符)
    \Q...\E                                   	逐字的引用
    (?...)                               		特殊结构
 

 

DEMO

 

import java.security.acl.Group;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class RegexTest {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("Enter pattern:");
		String patternString = in.nextLine();
		
		Pattern pattern = null;
		try{
			pattern = Pattern.compile(patternString);
		}catch(PatternSyntaxException e){
			e.printStackTrace();
			System.out.println("error");
			System.exit(1);
		}
		
		while(true){
			System.out.println("Enter string to match:");
			String input = in.nextLine();
			if(input==null || "".equals(input)){
				return;
			}
			
			Matcher matcher = pattern.matcher(input);
			if(matcher.matches()){
				System.out.println("Match");
				int groupCount = matcher.groupCount();
				if(groupCount>0){
					for(int i=0;i<input.length();i++){
						for(int j=1;j<=groupCount;j++){
							if(i == matcher.start(j)){
								System.out.print("(");
							}
						}
						System.out.print(input.charAt(i));
						for(int j=1;j<=groupCount;j++){
							if(i+1==matcher.end(j)){
								System.out.print(")");
							}
						}
					}
					System.out.println();
				}
			}else{
				System.out.println("No Match");
			}
		}
		
	}
}
分享到:
评论

相关推荐

    深入浅出正则表达式,正则表达式详细介绍

    ### 正则表达式详解 #### 一、正则表达式的定义与背景 正则表达式(Regular Expression),简称regex或regexp,是一种用于描述文本模式的强大工具。它可以帮助我们在文本中进行精确匹配、查找以及替换操作。正则...

    VB 正则表达式 使用详解

    VB 正则表达式使用详解 VB 正则表达式是指使用正则表达式在 VB 中进行字符串处理和搜索操作。正则表达式是一种强大的工具,能够在字符串中搜索和匹配特定模式。它可以应用于数据有效性验证、文本替换、字符串提取等...

    正则表达式语法(常用的正则表达式)

    正则表达式语法 正则表达式是一个强大的字符串处理工具,广泛应用于窗体验证、文本处理等领域。下面是正则表达式语法的详细介绍: 1. 元字符 元字符是正则表达式的特殊字符,它们具有特殊的含义。常见的元字符...

    Python基础入门知识之正则表达式学习 正则表达式30分钟入门教程 共21页.pdf

    正则表达式是编程语言中用于模式匹配的强大工具,尤其在数据处理和文本搜索替换时极为有用。Python作为一门广泛使用的编程语言,内置了强大的正则表达式支持。本教程旨在帮助初学者在30分钟内对Python中的正则表达式...

    如何写正则表达式,正则表达式常用实例

    正则表达式语法和实例总结 正则表达式是一种强大的字符串匹配工具,广泛应用于各种编程语言中,例如Java、Perl等。下面是正则表达式的语法和实例总结。 特殊字符 * `\` 将下一个字符标记为一个特殊字符、或一个原...

    VB正则表达式简介

    VB正则表达式简介 VB正则表达式是指在Visual Basic语言中应用的正则表达式技术。正则表达式是用来描述一个字符串模式的表达式,可以用来测试字符串是否与某个模式匹配,替换文本,根据模式匹配从字符串中提取一个子...

    头歌教学实践平台 Web前端开发基础 JavaScript学习手册十:正则表达式

    八、正则表达式的使用方法 1. `test()`:在字符串中查找是否存在匹配项,返回布尔值。 2. `exec()`:在字符串中查找匹配项,返回一个数组,包含匹配到的内容和位置信息。 3. `match()`:返回字符串中所有匹配正则...

    正则表达式详解(20分钟看懂正则)

    ### 正则表达式详解 #### 一、正则表达式概述 正则表达式是一种强大的文本模式匹配工具,广泛应用于编程语言如Java中,用于处理字符串数据,实现字符串的搜索、替换、提取等操作。它能够精确描述复杂的文本规则,...

    正则表达式大全.pdf

    #### 八、正则表达式匹配规则 1. **基本模式匹配**:如`cat`,匹配字符串中的“cat”。 2. **字符簇**:如`[aeiou]`,匹配字符串中的任一元音字母。 3. **确定重复出现**:如`a{2,5}`,匹配连续出现2到5次的字母“a...

    php正则表达式深入浅出.pdf

    - **.NET 正则表达式**:.NET框架中的正则表达式引擎提供了一些额外的功能,如条件分支和命名捕获组。 - **Java 正则表达式**:Java的正则表达式引擎也相当强大,支持Unicode匹配等特性。 #### 三、文字符号 正则...

    js项目中用到的正则表达式统计

    该文件中统计的正则表达式包含以下内容(都是实际项目中使用的,经过测试): 1、大于等于0的值,允许输入两位小数(边界值:100.0,100.00等值都已包含在验证的里面); 2、大于3小于40的整数; 3、0到1之间的小数...

    C#正则表达式完全手册

    C#正则表达式是.NET框架中用于在输入文本中匹配特定模式的一套工具。正则表达式由一个或多个字符文字、操作符或构造组成,可用于定义复杂的文本匹配规则。该文档作为一个手册,提供了快速参考的各个部分,覆盖了字符...

    最实用最全面的正则表达式

    ### 正则表达式知识点详解 #### 一、概述 正则表达式是一种强大的文本处理工具,被广泛应用于各种编程语言中,用于实现对文本的查找、替换、匹配等功能。本文将详细介绍一系列实用且全面的正则表达式,旨在帮助...

    《正则表达式中文手册》

    ### 正则表达式中文手册知识点详述 #### 一、引言 正则表达式是一种强大而灵活的文本处理工具,广泛应用于多种编程语言中,用于文本的搜索、替换和提取等操作。掌握正则表达式的使用对于任何从事软件开发工作的人员...

    正则表达式的匹配规则

    正则表达式是一种强大的文本处理工具,用于在字符串中查找、替换或提取符合特定模式的文本。它在编程、数据分析、文本挖掘等领域有着广泛的应用。本文将深入探讨正则表达式的匹配规则,帮助你理解和掌握这个强大的...

Global site tag (gtag.js) - Google Analytics