`
53873039oycg
  • 浏览: 825275 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]正则完全匹配

 
阅读更多

        最近使用正则replace时候遇到替换不正确的问题,如想替换an,实际上把can也替换成了c,下面的例子演示了如何删除完全匹配项
      

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class 正则完全匹配_S4_Test {
	public static void main(String[] args) throws Exception {
		String str = "an aN can ban and sand AN aN AnD an pan CaN Can an An AN";
		System.out.println("---------------拼接字符串-----------------");
		String resultStr=replaceByAppend("(?<=\\s+|^)(an)(?=\\s+|$)",str);
		System.out.println(String.format("结果为%s,长度%s", resultStr,resultStr.length()));
	}

	public static String replaceByAppend(String regEx, String str) {
		Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		int lastEnd = 0;//上一次匹配结束位置
		while (matcher.find()) {
			sb.append(str.substring(lastEnd, matcher.start()));
			lastEnd = matcher.end() + 1;
		}
		if(lastEnd<str.length()){
			sb.append(str.substring(lastEnd));
		}else{
			sb.deleteCharAt(sb.length()-1);//删除最后的空格
		}
		return sb.toString();
	}

}

    结果为:

   

---------------拼接字符串-----------------
结果为can ban and sand AnD pan CaN Can,长度32

    ---------------------------------------------------2014-10-23修改----------------------------------------------------------

   

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class 正则完全匹配_S4_Test {
	public static void main(String[] args) throws Exception {
		String str = "an aN AN An can banan an an ban and sand AN Ban anD aN AnD an pan CaN Can an An AN an's  an";
		System.out.println("---------------拼接字符串-----------------");
		String resultStr = replaceByAppend("(?<=\\s+|^)(an)(?=\\s+|$)", str);
		System.out.println(String.format("结果为%s,长度%s", resultStr,resultStr.length()));
		System.out.println("---------------正则-----------------");
		String resultStr2 = replaceRegAll("(?<=\\s+|^)(an)(?=\\s+|$)", str);
		System.out.println(String.format("结果为%s,长度%s",resultStr2,resultStr2.length()));
		String resultStr3=str.replaceAll("(?i)(?<=\\s+|^)(an)(?=\\s+|$)", "");
		System.out.println(String.format("结果为%s,长度%s", resultStr3,resultStr3.length()));
		String resultStr4 =replaceRegAll2("(\\s+)(an)(\\s+)", str);
		resultStr4 =replaceRegAll2("(^an)(\\s+)", resultStr4);
		resultStr4 =replaceRegAll2("(\\s+)(an$)", resultStr4);
		System.out.println(String.format("结果为%s,长度%s", resultStr4,resultStr4.length()));
		String str2="$name2 $name $name name";
		System.out.println(replaceRegFirst(str2,"$name","$****"));
	}

	public static String replaceByAppend(String regEx, String str) {
		Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		int lastEnd = 0;// 上一次匹配结束位置
		while (matcher.find()) {
			sb.append(str.substring(lastEnd, matcher.start()));
			lastEnd = matcher.end() + 1;
		}
		if (lastEnd < str.length()) {
			sb.append(str.substring(lastEnd));
		} else {
			sb.deleteCharAt(sb.length() - 1);// 删除最后的空格
		}
		return sb.toString();
	}

	public static String replaceRegAll(String regEx, String str) {
		Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher(str);
		str = matcher.replaceAll("");
		return str;
	}

	public static String replaceRegAll2(String regEx, String str) {
		Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher(str);
		while (matcher.find()) {
			str = matcher.replaceAll(" ");
			matcher = pattern.matcher(str);
		}
		return str;
	}
	
	// 替换First reg视为一般字符串匹配
	public static String replaceRegFirst(String str, String reg, String replace) {
		replace = replace == null ? "" : replace;
		return Pattern.compile(Pattern.quote(reg)).matcher(str).replaceFirst(Matcher.quoteReplacement(replace));
	}
}

   结果为:

  

---------------正则-----------------
结果为    can banan   ban and sand  Ban anD  AnD  pan CaN Can    an's  ,长度65
结果为    can banan   ban and sand  Ban anD  AnD  pan CaN Can    an's  ,长度65
结果为 can banan ban and sand Ban anD AnD pan CaN Can an's ,长度53
$****2 $name $name name	

 

    全文完
 

0
0
分享到:
评论

相关推荐

    Regex:Java中简单,快速的正则表达式匹配器

    这是一个非常基本的正则表达式匹配器,完全基于Java,具有基于超线性时间复杂度实现。 范围 支持的元字符是* +? ()| 和 \。 运算符的优先级是(从最弱的位置开始):|,然后是隐式级联,然后是* +?,并在顶部...

    正则表达式30分钟入门教程

    这几乎是最简单的正则表达式了,它可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个是i。通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它可以匹配hi,HI,Hi,hI这四种...

    shell模糊匹配与正则详解

    正则可以实现一些简单的功能,并用在脚本中,如检测ip地址是否符合规范,检测文件名是否符合规范等等。 正则表达式 正则表达式主要是用来描述一个句法规则的模式。其实说的通俗一点,就是利用字符和元字符的组合,...

    JAVA 正则表达式 教程

    该教程中所介绍的正则表达式应用仅仅是最为简单的(并没有完全地涉及到 Pattern 类支持的所有正则表达式语法,也没有涉及到高级的应用),适合于从未接触过或者是尚未完全明白正则表达式基础的学习者。在学习完该...

    正则表达式工具类

    典型的搜索和替换操作要求您提供与预期的搜索结果...可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 基于模式匹配从字符串中提取子字符串。 可以查找文档内或输入域内特定的文本。

    php正则表达匹配中文问题分析小结

    本文章分析了在php中正则表达式对中文的支持问题,一般情况下我们可会能简单利用我上面的正则来验证中文,后面我分析了关于兼容gb2312,utf-8和表达式 ^[x7f-xff]+$ 可以完全搞定中文不兼容的问题

    DEELX 正则表达式引擎

    完全使用模版库编写,支持 char, wchar_t, int 等以及其他基类型版本。 全部代码位于一个头文件(.h)中, 比任何引擎都使用简单和方便。 支持从右向左匹配模式,可从文本结束位置向前搜索匹配。 可防止零长度子...

    正则表达式 deelx

    全部代码位于一个头文件(.h)中, 比任何引擎都使用简单和方便。 支持从右向左匹配模式,可从文本结束位置向前搜索匹配。 可防止零长度子匹配循环无限次而产生的死循环。(1.2版本新特点) DEELX 不足之处: ...

    DEELX 正则表达式引擎 v1.2 免费版.rar

    完全使用模版库编写,支持 char, wchar_t, int 等以及其他基类型版本。 全部代码位于一个头文件(.h)中, 比任何引擎都使用简单和方便。 支持从右向左匹配模式,可从文本结束位置向前搜索匹配。 可防止零...

    C++ 环境下de正则表达式引擎

    免费好用的正则表达式引擎!! 完全免费 完全使用模版库编写,支持 char, wchar_t, int 等以及其他基类型版本。 全部代码位于一个头文件(.h)中, 比任何引擎都使用简单和方便。 支持从右向左匹配模式,可从文本...

    Kotlin利用Regex如何构建正则表达式详解

    对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。 其实只是对正则不了解而以,了解了你就会发现,原来就...

    DEELX 源码(C++ 正则表达式引擎)

    完全使用模版库编写,支持 char, wchar_t, int 等以及其他基类型版本。 全部代码位于一个头文件(.h)中, 比任何引擎都使用简单和方便。 支持从右向左匹配模式,可从文本结束位置向前搜索匹配。 可防止零长度子匹配...

    Android简单计算器

    比如用正则表达式匹配分割、表达式求值(程序使用中缀表达式转前缀表达式求值方法)、浮点数据精确计算问题、格式控制等。实现了将给定的String类型的算式进行相应的数学计算。重点是工具类的设计,额外提供了一些...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    * Summary of regular-expression constructs 正则表达式结构简介: * Construct Matches * Characters 字符: * x The character x x 字符 x * \\ The ...

    采用凹二次正则项的弹性点匹配算法 (2013年)

    现有的采用l1范数正则项的点匹配算法,其l1范数优化问题可等价为一个线性规划问题,但约束不满足完全的单模性,这导致解出的对应关系不是整数,需要后续的取整过程,这会给计算结果带来额外误差并使算法复杂化。...

    python爬虫入门教程--正则表达式完全指南(五)

    要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下,下面这篇文章主要给大家介绍了python爬虫之正则表达式的相关...

    xmux:go语言极简路由功能强大的HTTP路由器易于构建Go Web服务器

    组请求头,私有请求头支持自定义方法,多方法支持正则匹配和参数获取完全匹配优先于正则匹配正则匹配支持(int(\ d +),word(\ w +),re,all(。*?),不写串行string([^ /]))建议使用string支持三大变量...

    Java-PHP-C#

    简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹,例如:Perl或PHP脚本语言。此外,JavaScript这种客户端的脚本语言也提供了对正则...

    PyDNSServer:一个简单的可配置 DNS 服务器

    支持域名完全匹配(相等)或正则匹配(re.match)。比如*** 支持指定ip、允许、禁止策略: 指定ip: 直接返回该指定的ip地址 允许: 返回该域名对应的正真ip地址 禁止: 不对该域名进行解析,即返回解析失败 dnf.cfg...

Global site tag (gtag.js) - Google Analytics