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