正则表达式 这些问题你是否明白?

Java正则表达式

正则表达式很多地方都有,基本上都大同小异

 

它能干什么?

匹配?

效验每段字符是否合法

查找?

从整个文本中查找匹配字符

替换?

从整个文本中查找匹配字符并替换

 

首先要明白组的概念?

 

组的作用?

可以灵活的匹配、查找、替换

 

组在Java中的API 如何使用?

Matcher group group(int) groupCount   start(int) end(int)

 

 

matches find lookingAt 这个API有什么区别?

 

替换API都有哪些?如何使用?

appendReplacement

appendTail

提示:还可以利用start end 坐标的形式来进行替换,这个更加通用

 

quoteReplacement 作用?

 

表达式中匹配模式 CASE_INSENSITIVE DOTALL  作用?

内嵌标志表达式 是什么?如何使用?

 

贪婪匹配 非贪婪匹配 什么意思?有什么作用?使用场景?

http://spice.iteye.com/blog/1089859

 

 

以上概念如果都弄明白了,你可以对一个文本进行 匹配、查找、替换 一个个都没问题了

 

匹配的规则千奇百怪,如果来表达呢?这就要求你对表达式的语法很熟练?

正则表达式语法?

要知道都有什么?不需要都记得很清楚,用到的时候可以很快查到就行

这个语法基本上都是通用的,各种语言都差不多

 

Java regex 如何实现?提高自身设计能力

java.util.regex.Pattern.Node 

 

import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.FileUtils;
import org.junit.Test;

/**
 * <pre>
 * {} 定义了一个范围  [] 定义了一个字符类 () 定义了一个组
 * *前面出现0次以上   + 前面匹配一次以上 ?前面出现0次或一次  
 * </pre>
 */
public class RegexTest {

	private static String getFileContent(String fileName) {
		"xx".matches("\\s");
		String file = RegexTest.class.getResource(fileName).getFile();
		try {
			return FileUtils.readFileToString(new File(file));
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}
	@Test
	public void test1() {
		System.out.println("-------group-------------");
		String content = getFileContent("test1");
		System.out.println("内容:" + content);
		String regex = "((a)(b))(c)";
		System.out.println("表达式:" + regex);
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(content);
		System.out.println("是否找到:" + matcher.find());
		int groupCount = matcher.groupCount();
		System.out.println(groupCount);
		for (int i = 0; i <= groupCount; i++) {
			System.out.println("第 " + i + "组:  " + matcher.group(i));
		}
		// -----------------
		System.out.println("-------appendReplacement-------------");
		matcher.reset();
		StringBuffer sb = new StringBuffer();
		int findCount = 0;
		while (matcher.find()) {
			matcher.appendReplacement(sb, "$1 new");
			System.out.println("appendReplacement第" + findCount + "次:" + sb);
			findCount++;
		}
		matcher.appendTail(sb);
		System.out.println("appendTail之后的效果   :  " + sb);

		// -----------------
		System.out.println("-------start end -------------");
		matcher.reset();
		findCount = 0;
		while (matcher.find()) {
			System.out.println("开始位置:" + matcher.start());
			System.out.println("结束位置:" + matcher.end());
			System.out.println("匹配到的内容:" + content.subSequence(matcher.start(), matcher.end()));
			findCount++;
		}

		// -----------------
		System.out.println("-------start(group) end(group) -------------");
		matcher.reset();
		findCount = 0;
		while (matcher.find()) {
			System.out.println("开始位置:" + matcher.start(1));
			System.out.println("结束位置:" + matcher.end(1));
			System.out.println("匹配到的内容:" + content.subSequence(matcher.start(1), matcher.end(1)));
			findCount++;
		}

		// -----------------
		try {
			matcher.reset();
			System.out.println("-------matches find lookingAt -------------");

			System.out.println("find:" + matcher.find());// 只要部分匹配到就可以,可以通过多次find进行查找匹配
			// System.out.println("更多信息是否可以访问:" + matcher.start());

			System.out.println("matches:" + matcher.matches());// 正行匹配
			// System.out.println("更多信息是否可以访问:" + matcher.start());

			System.out.println("lookingAt:" + matcher.lookingAt());// 与find先比,开头必须匹配
			// System.out.println("更多信息是否可以访问:" + matcher.start());
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		System.out.println("----------quoteReplacement-------------");
		pattern = Pattern.compile(Matcher.quoteReplacement("\\d"));// 将特殊字符转换为一般字符进行匹配
		matcher = pattern.matcher(content);
		while (matcher.find()) {
			System.out.println(matcher.group());
		}
	}

	@Test
	public void test2() {
		String content = getFileContent("test2");
		System.out.println("内容:" + content);
		String regex = "<b>.*</b>";
		System.out.println("表达式:" + regex);
		System.out.println("-------默认匹配-------------");
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(content);
		while (matcher.find()) {
			System.out.println("匹配到的内容:");
			System.out.println(matcher.group());
		}

		/**
		 * \s 空白字符:[\t\n\x0B\f\r]
		 */
		System.out.println("-------默认匹配,通过表达式进行多行匹配,不推荐,如果字符串过大,如何堆栈溢出-------------");
		regex = "<b>\\s*(.*)\\s*</b>";
		pattern = Pattern.compile(regex);
		matcher = pattern.matcher(content);
		while (matcher.find()) {
			System.out.println("匹配到的内容:");
			System.out.println(matcher.group());
		}

		System.out.println("-------多行默认匹配   采用 编译参数-------------");

		regex = "<b>(.+?)</b>";
		pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
		matcher = pattern.matcher(content);
		while (matcher.find()) {
			System.out.println("匹配到的内容:");
			System.out.println(matcher.group());
		}

		System.out.println("-------多行默认匹配   采用 内嵌标志表达式-------------");
		// pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL);
		// matcher = pattern.matcher(content);
		// while (matcher.find()) {
		// System.out.println("匹配到的内容:" + matcher.group());
		// }

		regex = "(?si)<b>(.+?)</b>";
		pattern = Pattern.compile(regex);
		matcher = pattern.matcher(content);
		while (matcher.find()) {
			System.out.println("匹配到的内容:");
			System.out.println(matcher.group());
		}
	}

	@Test
	public void test3() {
		System.out.println("--(?!X) ----Negative Lookahead---------------");
		String content = "aab aac";
		System.out.println("内容:" + content);
		String regex = "aa(?!b)";
		System.out.println("表达式:" + regex);
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(content);
		while (matcher.find()) {
			System.out.println("匹配内容:" + matcher.group());
		}
		// "".matches(regex)
		System.out.println(Pattern.matches(regex, "aac"));
		System.out.println(Pattern.matches(regex, "aab"));

	}

	@Test
	public void test4() {
		System.out.println("--边界匹配器---------------");
		String content = "aab aab";
		String regex = "\\baab\\b";
		System.out.println("表达式:" + regex);
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(content);
		while (matcher.find()) {
			System.out.println(matcher.group());
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值