string test = "one test <123>, another test <321>";
Regex reg = new Regex(@"<(\d+)>");
string result = reg.Replace(test, "<$$1>");
richTextBox2.Text = result;
/*--------输出--------
one test <$1>, another test <$1>
*/
也许你会惊奇的发现,替换结果不是在数字前加了“$”,而是将所有数字都替换为“$1”了。
为什么会这样呢,这是因为在替换结构中,“$”是有特殊意义的,在它后面接数字,表示对对应编号捕获组匹配结果的引用,而有些情况下,需要在替换结果中出现“$”字符本身,但它后面又跟了数字,这时候就需要用“$$”对它进行转义了。而上面这个例子却恰恰是由于这种转义效果导致出现了异常结果,要规避这一问题,可以使替换结果中不出现对捕获组的引用。
string test = "one test <123>, another test <321>";
Regex reg = new Regex(@"(?<=<)(?=https://www.jb51.net/article/\d+>)");
string result = reg.Replace(test, "$");
richTextBox2.Text = result;
/*--------输出--------
one test <$123>, another test <$321>
*/
3 JavaScript及Java中的转义符
JavaScript及Java中正则的转义符处理,以字符串形式声明时,基本上都是与.NET中一致的,简单的介绍一下。
在JavaScript中,以字符串形式声明正则,与C#中的表现是一样的,同样会显得很笨拙。
复制代码 代码如下:
<script type="text/javascript">
var data = ["\\", "\\\\"];
var reg = new RegExp("^\\\\$", "");
for(var i=0;i<data.length;i++)
{
document.write("源字符串:" + data[i] + " 匹配结果:" + reg.test(data[i]) + "<br />");
}
</script>
/*--------输出--------
源字符串:\ 匹配结果:true
源字符串:\\ 匹配结果:false
*/
JavaScript中虽然没有提供C#中这种“@”方式的字符串声明方式,但提供了另一种正则表达式的专有声明方式。
复制代码 代码如下:
<script type="text/javascript">
var data = ["\\", "\\\\"];
var reg = /^\\$/;
for(var i=0;i<data.length;i++)
{
document.write("源字符串:" + data[i] + " 匹配结果:" + reg.test(data[i]) + "<br />");
}
</script>
/*--------输出--------
源字符串:\ 匹配结果:true
源字符串:\\ 匹配结果:false
*/
JavaScript中
var reg = /Expression/igm;
这种声明方式,一样可以简化含有转义符的正则。
当然,以这种形式声明正则时,“/”自然也就成为了元字符,正则中出现这一字符时,必须进行转义处理。比如匹配链接中域名的正则
var reg = /http:\/\/:([^\/]+)/ig;
很不幸的是,在Java中,目前只提供了一种正则声明方式,也就是字符串形式的声明方式
复制代码 代码如下:
String test[] = new String[]{"\\", "\\\\" };
String reg = "^\\\\$";
for(int i=0;i<test.length ;i++)
{
System.out.println("源字符串:" + test[i] + " 匹配结果:" + Pattern.compile(reg).matcher(test[i]).find());
}
/*--------输出--------
源字符串:\ 匹配结果:true
源字符串:\\ 匹配结果:false
*/
只能期待Java的后续版本能提供这方面的优化了。