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()); } } }
相关推荐
该教程中所介绍的正则表达式应用仅仅是最为简单的(并没有完全地涉及到 Pattern 类支持的所有正则表达式语法,也没有涉及到高级的应用),适合于从未接触过或者是尚未完全明白正则表达式基础的学习者。在学习完该...
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难。当然...
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符...
本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的...
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时...
java 正则表达式 正则表达式详解大全 阅读以后你会明白各种 表达式符号的全部意义 让正则表达式不在困难 是难得的好资源啊
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 如何使用本教程 最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门——...
.net中写了个正则表达式字符串,不知在整个程序运行时候是否正确,是否能解析出正确的字符串。可以先在这个小程序中验证一下。这样就不必运行整个程序来验证了。 源码很简单,一看就明白了。可以自己编译出exe程序
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 ●如何使用本教程 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像...
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。
正则表达式30分钟入门教程(超经典)30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。最重要的是——请给我30分钟, 如果你没有使用正则表达式的经验,请不要试图在30秒内入门——除非你是超人 :) 别...
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 如何使用本教程 最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门。当然...