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分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符...
本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的...
当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白...
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时...
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 如何使用本教程 最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门——...
.net中写了个正则表达式字符串,不知在整个程序运行时候是否正确,是否能解析出正确的字符串。可以先在这个小程序中验证一下。这样就不必运行整个程序来验证了。 源码很简单,一看就明白了。可以自己编译出exe程序
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 ●如何使用本教程 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像...
2. **测试与调试**:在RegexBuddy中,你可以实时测试你的正则表达式,查看它是否正确匹配目标文本。软件会高亮显示匹配的区域,帮助理解匹配过程。此外,还可以通过步进调试功能,逐行分析正则表达式的执行过程。 3...
在本压缩包文件"30分钟内让你明白正则表达式是什么.rar"中,我们有望通过30分钟的学习,掌握正则表达式的基本概念和常用操作,从而在编写程序或设计网页时能够灵活运用。 正则表达式的核心在于定义一套规则,这些...
通过学习,你不仅可以解决编写表单验证的问题,还能在数据分析、文本处理等领域发挥正则表达式的作用,大大提高工作效率。记住,熟练掌握正则表达式需要时间和实践,但一旦你掌握了它,你会发现它真的就是这么简单,...
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 如何使用本教程 最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门。当然...