正则基础之 神奇的转义(4)


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的后续版本能提供这方面的优化了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wfyzjd.html