`
lizhensan
  • 浏览: 378563 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

    博客分类:
  • java
 
阅读更多

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());
		}
	}
}

 

分享到:
评论

相关推荐

    常用正则表达式生成软件 学习文档

    30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难。当然...

    正则表达式 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。

    30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符...

    Python正则表达式标准库使用教程.pdf

    本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。   1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的...

    正则表达式30分钟入门教程.rar

    当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白...

    关于在LABVIEW中使用正则匹配公式.vi

    正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时...

    30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。

    在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

    正则表达式学习教程

    30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 如何使用本教程 最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门——...

    正则表达式自学文档,30分钟学会正则表达式

    本教程旨在帮助你入门,让你明白正则表达式的本质,而深入掌握则需要后续的练习和查阅相关资料。 正则表达式的基本元素包括元字符和语法格式。例如,`\b`是元字符,表示单词的边界,`*`表示前面的字符可以重复任意...

    正则表达式验证程序源码

    .net中写了个正则表达式字符串,不知在整个程序运行时候是否正确,是否能解析出正确的字符串。可以先在这个小程序中验证一下。这样就不必运行整个程序来验证了。 源码很简单,一看就明白了。可以自己编译出exe程序

    正则表达式30分钟入门教程

    30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 ●如何使用本教程 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像...

    正则表达式生成功能工具

    2. **测试与调试**:在RegexBuddy中,你可以实时测试你的正则表达式,查看它是否正确匹配目标文本。软件会高亮显示匹配的区域,帮助理解匹配过程。此外,还可以通过步进调试功能,逐行分析正则表达式的执行过程。 3...

    30分钟内让你明白正则表达式是什么.rar

    在本压缩包文件"30分钟内让你明白正则表达式是什么.rar"中,我们有望通过30分钟的学习,掌握正则表达式的基本概念和常用操作,从而在编写程序或设计网页时能够灵活运用。 正则表达式的核心在于定义一套规则,这些...

    正则表达式就是这么简单

    通过学习,你不仅可以解决编写表单验证的问题,还能在数据分析、文本处理等领域发挥正则表达式的作用,大大提高工作效率。记住,熟练掌握正则表达式需要时间和实践,但一旦你掌握了它,你会发现它真的就是这么简单,...

    正则表达式教程

    30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 如何使用本教程 最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门。当然...

    30分钟学会正则表达式

    当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白...

Global site tag (gtag.js) - Google Analytics