regmathertest2.java

来自「Java 正则表达式的用法: 取反字符集 贪婪匹配」· Java 代码 · 共 48 行

JAVA
48
字号
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import junit.framework.TestCase;

public class RegMatherTest2 extends TestCase {
	/**
	 * 取反字符集
	 * q[^u] 并不意味着:匹配一个q,后面没有u跟着。它意味着:匹配一个q,后面跟着一个不是u的字符。
	 * 所以它不会匹配“Iraq”中的q,而会匹配“Iraq is a country”中的q和一个空格符。
	 * 事实上,空格符是匹配中的一部分,因为它是一个“不是u的字符”。
	 */

	public void testDenial() {
		Pattern p = Pattern.compile("(q[^u])");
		String s = "Iraq is a country.";
		Matcher m = p.matcher(s);
		if (m.find()) {
			assertEquals(m.group(1), "q ");
		}
	}

	/**
	 * 贪婪匹配
	 * <.+> 不会分别匹配 This is a <EM>first</EM> test 中的 <EM> 和 </EM>
	 * 它会匹配 <EM>first</EM>
	 */
	public void testGreedy() {
		Pattern p = Pattern.compile("(<.+>)");
		String s = "This is a <EM>first</EM> test";
		Matcher m = p.matcher(s);
		if (m.find()) {
			assertEquals(m.group(1), "<EM>first</EM>");
		}
		//1. 修订为精确查询,因为不需要回朔,性能最佳
		p = Pattern.compile("(<[^>]+>)");
		m = p.matcher(s);
		if (m.find()) {
			assertEquals(m.group(1), "<EM>");
		}
		//2. 用懒惰性取代贪婪性(用问号?)
		p = Pattern.compile("(<.+?>)");
		m = p.matcher(s);
		if (m.find()) {
			assertEquals(m.group(1), "<EM>");
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?