Java正则表达式——Java筑基

正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或者是处理文本。
正则表达式并不仅仅局限于某种语言,但是在每个语言中都有差异。


正则表达式实例

一个字符串就是一个简单的正则表达式,例如Hello world正则表达式匹配“Hello world”的字符串。

.就是一个正则表达式,匹配任意一个字符例如:“a”或者“1”。

给出如图所示的正则表达式实例:
在这里插入图片描述

Java正则表达式和Perl很类似。
java.util.regex包主要包含了如下三个类:

  • Pattern类:
    pattern对象是一个正则表达式的编译表示。Pattern类没有公共的构造方法,首先调用其公共静态方法,返回一个Pattern对象,该方法接受一个正则表达式作为其第一个参数。
  • Matcher类:
    Matcher对象是对输入的字符串进行解释和匹配操作的引擎,和Pattern类一样,没有公共的构造方法,需要调用Pattern对象的Matcher方法获得一个该类对象。
  • PatternSyntaxException:
    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

给出如下实例代码:

package regex;

import java.util.regex.Pattern;

public class RegexExample1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String content = "I am runoob" + "from runoob.com";
		String pattern = ".*runoob.*";
		boolean isMatch = Pattern.matches(pattern, content);
		System.out.println("字符串是否包含了'runoob'的字符串?: " + isMatch);
	}
}

捕获组

捕获组是把多个字符当一个单独的单元进行了处理的方法,通过对括号内的字符分组来创建。
例如,正则表达式(dog)创建了一个单一分组,组里包含"d",“o”,和"g"。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:

  • ((A)(B( C)))
  • (A)
  • (B( C))
  • ( C)

通过调用matcher对象的groupCount方法查看表达式有多少个分组。groupCount方法返回一个int数值,表示matcher对象当前有多个捕获的组。
还有一个特殊的组(group(0)),它总是代表整个表达式。该组不在groupCount的返回值中。

给出如下实例代码:

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 按照指定模式在字符串中查找
		String line = "This order wa placed for QT3000! OK?";
		String pattern = "(\\D*)(\\d+)(.*)";

		// 创建pattern对象
		Pattern r = Pattern.compile(pattern);

		// 现在创建了matcher对象
		Matcher m = r.matcher(line);
		if (m.find()) {
			System.out.println("Found value: " + m.group(0));
			System.out.println("Found value: " + m.group(1));
			System.out.println("Found value: " + m.group(2));
			System.out.println("Found value: " + m.group(3));
		} else {
			System.out.println("NO MATCH");
		}
	}
}

结果如图所示:
在这里插入图片描述


正则表达式语法

在其他的语法中,\\表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在Java中,\\表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

System.out.print("\\");    // 输出为 \
System.out.print("\\\\");  // 输出为 \\

语法详细可以参见这篇文章:Java正则表达式语法示例大全

匹配验证Email是否正确

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class checkEmail {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 验证的字符串
		String str = "service@xsoftlab.net";
		// 邮箱验证的规则
		String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";
		// 编译正则表达式
		Pattern pattern = Pattern.compile(regEx);
		// 忽略的大小写的方法
		Matcher matcher = pattern.matcher(str);
		// 字符串是否正则表达式匹配
		boolean rs = matcher.matches();
		System.out.println(rs);
	}
}

字符串中查询字符或者字符串

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * @ClassName: regexMatchDemo2
 */
public class regexMatchDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 要验证的字符串
		String str = "baike.xsoftlab.net";
		// 正则表达式规则
		String regEx = "baike.*";
		// 编译正则表达式
		Pattern pattern = Pattern.compile(regEx);
		// 忽略大小写的写法
		// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher(str);
		// 查找字符串中是否有匹配正则表达式的字符/字符串
		boolean rs = matcher.find();
		System.out.println(rs);
	}
}

根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 “\b” 与单个退格字符匹配,而 “\b” 与单词边界匹配。字符串字面值 “(hello)” 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 “\(hello\)”。


Matcher类方法

索引方法

索引方法提供了有用的缩影数值,精确表明输入字符串中在哪儿能找到匹配:

  • public int start()
    返回以前匹配的初始索引。
  • public int start(int group)
    返回以前的匹配操作期间,由给定的组所捕获的子序列的初始索引。
  • public int end()
    返回最后匹配的字符之后的偏移量。
  • public int end(int group)
    返回在以前的匹配操作期间,给定组所捕获的子序列的最后字符之后的偏移量。

查找方法

查找方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:

  • public boolean lookingAt()
    尝试将从区域开头开始的输入序列与该模式匹配。
  • public boolean find()
    尝试查找与该模式匹配的输入序列的下一个子序列。
  • public boolean find(int start)
    重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
  • public boolean matches()
    尝试将整个区域与模式匹配。

start和end方法

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class regexStartEnd {
	private static final String REGEX = "\\bcat\\b";
	private static final String INPUT = "cat cat cat cattie cat";

	public static void main(String[] args) {
		Pattern p = Pattern.compile(REGEX);
		// 获取 matcher 对象
		Matcher m = p.matcher(INPUT);
		int count = 0;

		while (m.find()) {
			count++;
			System.out.println("Match number " + count);
			System.out.println("start(): " + m.start());
			System.out.println("end(): " + m.end());
		}
	}
}

Start 方法返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引;end 方法最后一个匹配字符的索引加 1。


matches 和 lookingAt 方法

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class replaceFirstAll {
	private static String REGEX = "dog";
	private static String INPUT = "The dog says meow. " + "All dogs say meow.";
	private static String REPLACE = "cat";

	public static void main(String[] args) {
		Pattern p = Pattern.compile(REGEX);
		// get a matcher object
		Matcher m = p.matcher(INPUT);
		INPUT = m.replaceAll(REPLACE);
		System.out.println(INPUT);
	}
}

replaceFirstreplaceAll 方法用来替换匹配正则表达式的文本。

注意,不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。

appendReplacement 和 appendTail 方法

Matcher类提供了appendReplacement 和 appendTail 方法用于文本替换:

package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatchTest {
	private static String REGEX = "a*b";
	private static String INPUT = "aabfooaabfooabfoobkkk";
	private static String REPLACE = "-";

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Pattern p = Pattern.compile(REGEX);
		// 获取 matcher 对象
		Matcher m = p.matcher(INPUT);
		StringBuffer sb = new StringBuffer();
		while (m.find()) {
			m.appendReplacement(sb, REPLACE);
		}
		m.appendTail(sb);
		System.out.println(sb.toString());
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值