您的位置:首页 > 编程语言 > Java开发

正则表达式学习总结, 附java源码

2010-05-28 21:21 786 查看
组的概念, 提取组信息

/**
	 * 正则表达式可以划分不同的组,取出组的名称,括号即可, 即所谓的捕获组
	 * 1. 相关知识: 不捕获用(?:expression) 表示这组不需要捕获
	 * 
	 * 
	 */
	public static void groupTest() {
		String src = "xxxxxxxxxx2009-1-17-19-07-16yyyyy2001-02-18-19-07-16q";
		String regex = "(//w{4})(//d{4}-//d{1,2}-//d{1,2}-//d{1,2}-//d{1,2}-//d{1,2})";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(src);
		displayMatchResult(matcher);
	}


或关系的表达

/**
	 * 1. 单个字符或者数字的"或关系"用[]即可, 这里不做展示
	 * 2. 多个字符的"或关系"用括号展示
	 * 3. 提取括号的内容, 请看下面的例子, 关注group的index
	 * 4. 这里的Group可以不捕获,不捕获的方式是(?:expression)
	 * 5. 这里推出的问题是:"非逻辑关系怎么搞"(与逻辑关系就算了, 默认的都是与逻辑关系)
	 * 6. 非关系, 归类到"零宽度"中
	 * 
	 */
    public static void groupOr_Nested()
    {
    	String src = "x1111abcxxxyyy";
		String regex = "((?:x1111|y2222)abc)xxx";
		//String regex = "((x1111|y2222)abc)xxx";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(src);
		displayMatchResult(matcher);
    }


贪婪和非贪婪匹配

/**
	 * 贪婪匹配和非贪婪匹配的比较
	 * 这是一个加不加问好的问题了
	 */
	public static void greedCompare()
	{
		String src = "<p class=/"author/"> <strong>admin </strong></strong> 发表于 2009-5-14 16:49 </p><h3>提取帖子内容 </h3>“提取这句话”<br /> <br />";
		/**非贪婪匹配用下面*/
		//String regex = "<strong>(.*?)</strong>";
		/**贪婪匹配用下面 */
		String regex = "<strong>(.*)</strong>";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(src);
		displayMatchResult(matcher);
	}


替换字符

/**
	 * 替换, 该方法很水, 简单的可用, 复杂的
	 * 应该通过match.star(groupIndex)来找位置比较方便
	 */
	public static void replaceMatch()
	{
		String src = "xxxxxxxxxx2009-1-17-19-07-16yyyyy2001-02-18-19-07-16q";
		String regex = "(//w{4})(//d{4}-//d{1,2}-//d{1,2}-//d{1,2}-//d{1,2}-//d{1,2})";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(src);
		displayMatchResult(matcher);
		System.out.println(matcher.replaceFirst("---"));
		System.out.println(matcher.replaceAll("---"));
	}


组的引用



/**
	 * 群组的引用, 按照标号/1, /2的方式引用之前出现的内容
	 */
	public static void group_reference()
	{
		String src = "love me love me xxxxxx";
		String regex = "//b(//w+)//s+//b(//w+)//s+//1//s//2//b";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(src);
		displayMatchResult(matcher);
	}


零宽度匹配之前向匹配

/*1. 零宽度, 即表达式的值不参与匹配结果*/
	/**
	 * 前面存在某项, 需要满足等于/不等于的条件
	 * (?<=expression) -------- (?<!expression)
	 */
	public static void zero_front()
	{
		String src = "xxxx---yyyhelloworldzzzz";
		String regex = "(?<=yyy)helloworld";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(src);
		displayMatchResult(matcher);
	}


零宽度匹配之后向匹配



/**
	 * 
	 * 后面存在某项, 需要满足等于/不等于的条件
	 * (?=expression) -------- (?!expression)
	 */
	public static void zero_back()
	{
		String src = "xxxx---yyyhelloworldzzzz";
		String regex = "helloworld(?=zzzz)";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(src);
		displayMatchResult(matcher);
	}




附注:



上述代码中展现结果的方法为:

/**
	 * 打印匹配的结果
	 * 匹配了多少次
	 * 每次匹配的字符及Group的提取
	 * @param matcher
	 */
	private static void displayMatchResult(Matcher matcher)
	{
		int groupCount = matcher.groupCount();
		int matchCount = 0;
		while (matcher.find()) {
			matchCount++;
			System.out.println("第" + matchCount + "次匹配成功");
			for (int i = 0; i <= groupCount; i++)
			{
				//0表示所有的串
				System.out.println("group index " + i + ":" + matcher.group(i).trim());
				System.out.println("开始位置:" + matcher.start(i));
				System.out.println("结束位置:" + matcher.end(i));
			}
		}
	}






上述完整源码下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: