`
53873039oycg
  • 浏览: 842003 次
  • 性别: 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
分享到:
评论

相关推荐

    正则表达式匹配算法小结

    然而,如果需要找出文本中所有完全匹配的位置,则时间复杂度会上升到O(nm^2)。 ##### 传统的DFA模拟 传统的DFA模拟是将正则表达式转换为确定有限自动机(Deterministic Finite Automaton, DFA),然后使用DFA进行...

    nodejs+字符串的模式匹配+正则表达式+判断获取字符串的某些需求

    正则表达式不仅可以用于简单的文本匹配,还可以通过各种高级特性实现更复杂的功能。 1. **字符类**:可以定义一组字符供匹配。例如 `[a-zA-Z]` 表示匹配任意的英文字母。 2. **重复字符**:使用 `{n,m}` 来限定匹配...

    IOS Sqlite正则匹配

    SQLite提供了`LIKE`操作符来执行简单的模式匹配,虽然它不完全等同于正则表达式,但在某些情况下可以满足基本需求。例如: ```sql SELECT * FROM myTable WHERE myColumn LIKE '%pattern%'; ``` 上述查询将返回...

    C#正则表达式完全手册

    C#正则表达式是.NET框架中用于在输入文本中匹配特定模式的一套工具。正则表达式由一个或多个字符文字、操作符或构造组成,可用于定义复杂的文本匹配规则。该文档作为一个手册,提供了快速参考的各个部分,覆盖了字符...

    php用正则表达式匹配中文实例详解

    在UTF-8编码下匹配中文字符则相对简单。UTF-8是一种针对Unicode的可变长度字符编码,它能够用一个到四个字节表示一个字符。匹配中文字符的正则表达式 "/^[x{4e00}-x{9fa5}]+$/u" 中,Unicode码点范围[x{4e00}-x{9fa5...

    常用正则表达式(常用的匹配)

    它能够识别简单的HTML标签,但对于复杂的嵌套结构可能无法完全匹配。第一部分`&lt;(\S*?)[^&gt;]*&gt;.*?&lt;/\1&gt;`用于匹配闭合标签,第二部分`*? /&gt;`用于匹配自闭合标签。 #### 匹配首尾空白字符 **正则表达式**: `^\s*|\s*$` ...

    检查正则表达式是否匹配

    在上述代码中,`boost::regex_match()`函数用于检查目标字符串`target`是否完全匹配给定的正则表达式`regexPattern`。如果匹配成功,函数将返回`true`,否则返回`false`。 正则表达式的语法非常丰富,包括但不限于...

    shell编程 之 正则表达式

    2. **完全匹配**:当我们要找到一个完全匹配的字符串时,可以使用正则表达式来实现。例如,如果要在文件中查找字符串`example`,我们可以直接使用`grep 'example' filename`命令。 3. **包含匹配**:包含匹配指的是...

    PHP简单实现正则匹配省市区的方法

    本篇文章将详细讲解如何使用PHP实现一个简单的正则匹配省市区的方法,并探讨相关操作技巧。 首先,我们看给定的正则表达式: ```php preg_match('/(.*?(省|自治区|北京市|天津市))+(.*?(市|自治州|地区|区划|县))+...

    正则表达式获取网页HTML,css,js,图片等

    正则表达式可能无法完全解析CSS语法,但对于简单的提取任务,它可以胜任。 3. **JavaScript提取**: JavaScript提供了动态交互性。在HTML中,JS可以内联(`&lt;script&gt;`标签内)或作为外部文件(`&lt;script src&gt;`)。...

    快速完全精通正则表达式

    无论是简单的文本查找替换,还是复杂的模式匹配分析,正则表达式都能够帮助我们高效地完成任务。 ##### 正则表达式作为一门语言 本书作者弗里德尔(Jeffrey E. F. Friedl)认为,理解正则表达式的关键在于将其视为...

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

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

    c++写的正则表达式验证工具

    Boost库的正则表达式组件,即`boost::regex`,是C++实现正则表达式的常用选择之一,它提供了一套完整的API接口,使得在C++中编写正则表达式相关的代码变得相对简单。 在Visual Studio 2008环境下,开发者可以将...

    Android编程开发中的正则匹配操作示例

    这个正则表达式能够匹配大部分常见格式的电子邮件地址,但并不保证完全覆盖所有合法的邮箱格式。 3. **IP地址的验证** IP地址由四个十进制数字构成,每个数字范围是0到255,之间用点分隔。验证IP地址可以使用...

    PHP中的正则表达式(DOC)

    例如,"^hello$"只会匹配完全等于"hello"的字符串,而"hello"则会匹配任何包含"hello"的字符串。如果想匹配以特定字符开始或结束的字符串,可以使用"^"和"$"结合。 正则表达式中的特殊字符还有许多其他用途。"."是...

    iOS App开发中Objective-C使用正则表达式进行匹配的方法

    在iOS应用开发中,Objective-C作为主要的编程语言之一,提供了多种方式来处理字符串的正则表达式匹配。正则表达式是一种强大的文本处理工具,常用于数据验证、搜索和替换等场景。以下是对标题和描述中所述知识点的...

    JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)

    它只能匹配xxx.yyy的基本URL格式,对于更复杂的URL,如带有端口、路径、查询参数等的网址则无法完全匹配。对于需要更严格验证的场景,可能需要设计更复杂的正则表达式。 最后,文章推荐了几个关于JavaScript正则...

Global site tag (gtag.js) - Google Analytics