正则表达式替换问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式替换问题相关的知识,希望对你有一定的参考价值。

比如我要把一个文本文件中的"www.ABCDE.com"字符串替换为"www.AABBCCDDEE.com",用正则表达式如何替换呢?
注1:ABCDE是不确定的字符,也有可能是XYZ等等,能用一个正则表达式一次替换完毕。
注2:中间字母的数量不一定是五个,有可能是六个七个....
ynsjwh可以说的详细点吗?我知道正则的引用,但像题中的情况用引用又如何解决呢?

不知道你是用什么语言来写. 不过不管是什么语言, 只要其支持正则表达式的反向引用特性, 要实现你说的很简单.

php为例,正则这样写:"/(www\.)(\w+)(\.com)/"。该正则把你要查找的内容分成了3个子表达式。接下来要做的就是替换第2个子表达式。设你要把中间的内容替换为“AABBCCDDEEFF”,在$string中进行查找替换,可如下实现:
preg_replace("/(www\.)(\w+)(\.com)/","\$1AABBCCDDEEFF\$3", $string);

各种语言实现的方式可能不同,但是基本原理是相同的。

我必须更正一下我的回答。先前没有经过测试。当我仔细研究过正则表达式后,有了更清晰的认识。以下是我用javascript实现的:

var str = "\
http://www.aaa.com\n \
http://www.bbb.cn\n \
http://www.ccc.org\
";

var reg = /(http:\/\/www\.)((?!google)\w+)(\.(com|cn|org))/g;
str = str.replace(reg,RegExp.leftContext+'$1google$3'+RegExp.rightContext);
替换后的字符串是:
"\
http://www.google.com\n \
http://www.google.cn\n \
http://www.google.org\
";

以下是更优雅的实现:
str = str.replace(reg,refunc);
function refunc(a,b,c,d)
var a;
return b+'google'+d;


实践证明它可以找出所有匹配的子串并对子串的子串进行替换。根据你的需要你可以重写正则表达式。

相信别的语言也提供了类似的功能。
参考技术A 使用 js

<script>
var t = "ABCDEFF";

alert(t.replace(/(.)/gi, "$1$1"));
</script>

其他语言类似
参考技术B using System;
using System.Text.RegularExpressions;

class SampleReplace
public static void Main()

string inputString = "要修改的字符串!";
string pattern = "正则表达式";
string replacement = "替换字符串";

string output = Regex.Replace(inputString, pattern, replacement);
Console.WriteLine(output); //输出"利用C#中的<替换一下>可以很好地处理[替换一下]问题!"

参考技术C 在查找栏中输入:www.(\d)(\d)(\d)(\d)(\d).com
在替换栏中输入:www.(\1)2(\2)2(\3)2(\4)2(\5)2.com
参考技术D 因为注2的原因,正则办不到了。

java用正则表达式判定特殊字符是不是,存在就替换的问题?

我在String ss = "aabbcc[dd]eeff[gg]hhiijjkkll[mmnn]oopp";这个字符串,用正则表达式把[]这样的特殊字符过滤出来,就是把[dd]替换成dd,原来的字符串里面也变成aabbccddeeff...

String的replaceAll方法可以使用正则表达式进行搜索并替换,但不改变原字符串,如果需要改变原字符串,则需要用赋值语句:
ss=ss.replaceAll("正则表达式","替换内容");
比如将"aabbcc[dd]eeff[gg]hhiijjkkll[mmnn]oopp"里的[等特殊符号去掉:
ss=ss.replaceAll("\W","");
参考技术A 至少有两种正则表达式的方法:

1、直接调用String类的replaceAll(String regex, String replacement)方法

代码:
String ss = "aabbcc[dd]eeff[gg]hhiijjkkll[mmnn]oopp";
ss.replaceAll("[\\[\\]\\\\]", "");//返回结果,可打印或返回
优点:简单
缺点:不具有通用性,需求变动则不适用,例如[dd]替换成DD

2、通过匹配规则来截取字符串

代码:
String ss = "aabbcc[dd]eeff[gg]hhiijjkkll[mmnn]oopp";
//正则表达式,表示由非[、]、、的任意字符构成
String tmp = "[^\\[^\\^\\]^\\.]";
//正则表达式,由5组构成第一组是普通字符串,第二组是"["字符串,第三组是普通字符串,第四组是"]"字符串,第五组是普通字符串
Pattern pattern = Pattern.compile("(" + tmp + "*)(\\[\\)(" + tmp + "*)(\\\\])(" + tmp + "*)");
Matcher matcher = pattern.matcher(ss);
StringBuffer result = new StringBuffer();
while(matcher.find())
result.append(matcher.group(1) + matcher.group(3) + matcher.group(5));

//result就是最终结果。

优点:具有一定的通用性,可自己定制需要的字符串,新字符串可以由原字符串的部分组成,也可与其他字符拼装,能更好满足可重用性,例如需求变更成[dd]替换成DD,代码只需将result.append(matcher.group(1)+matcher.group(3)+matcher.group(5));换成result.append(matcher.group(1)+matcher.group(3).toUpperCase()+matcher.group(5));就能完成

缺点:代码较长

PS:StringBuffer可转化成String再返回
参考技术B [\[\\\]]+

在java中

String ss = ss.replaceAll("[\\[\\\\\\]]+", "");

以上是关于正则表达式替换问题的主要内容,如果未能解决你的问题,请参考以下文章

delphi 简单正则替换 问题

C#正则表达式指定替换

用正则表达式实现替换

java用正则表达式判定特殊字符是不是,存在就替换的问题?

正则表达式高级替换,匹配后进行运算,然后使用结果替换,怎么实现?

正则表达式替换(急在线等待)