正则表达式 – C#的行为与Perl / Python不同

前端之家收集整理的这篇文章主要介绍了正则表达式 – C#的行为与Perl / Python不同前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Python下:
ttsiod@elrond:~$python
>>> import re
>>> a='This is a test'
>>> re.sub(r'(.*)','George',a)
'George'

在Perl下:

ttsiod@elrond:~$perl
$a="This is a test";
$a=~s/(.*)/George/;
print $a;
(Ctrl-D)

George

在C#下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Text.RegularExpressions;

namespace IsThisACsharpBug
{
  class Program
  {
    static void Main(string[] args)
    {
        var matchPattern = "(.*)";
        var replacePattern = "George";
        var newValue = Regex.Replace("This is nice",matchPattern,replacePattern);
        Console.WriteLine(newValue);
    }
  }
}

不幸的是,C#打印:

$csc regexp.cs
Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.5420
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

$./regexp.exe 
GeorgeGeorge

这是C#正则表达式库中的错误吗?为什么它会打印“George”两次,当Perl和Python只打印一次?

在您的示例中,差异似乎在“替换”函数的语义中,而不是在正则表达式处理本身中.

.net正在进行“全局”替换,即它正在替换所有匹配,而不仅仅是第一次匹配.

全局替换Perl

(注意= ~s行末尾的小’g’)

$a="This is a test";
$a=~s/(.*)/George/g;
print $a;

哪个产生

GeorgeGeorge

在.NET中单个替换

var re = new Regex("(.*)");
var replacePattern = "George";
var newValue = re.Replace("This is nice",replacePattern,1) ;
Console.WriteLine(newValue);

哪个产生

George

因为它在第一次更换后停止.

原文链接:https://www.f2er.com/regex/356583.html

猜你在找的正则表达式相关文章