smhy8187

 

使用[MatchEvaluator类] - 替换多个字符串

使用[MatchEvaluator类] - 替换多个字符串

 最近在学习xml的时候遇上这样一个问题。读取mp3信息然后录入到数据库中的xml字段。

然而mp3信息中,如在标题中存在这样一种特殊情况: 标题包含XML的特殊字符而导致输入出错.

如: Kill'em All 中的 '    You&Me 中的&  还有其他一些诸如'<'  '>'等等.

 

利用正则表达式找出特殊字符

我们当然可以轻易地利用正则表达式查找出那些特殊字符并用Replace()替换掉他们, 如下:

 using System.Text.RegularExpressions;

public class Test
{
    
static void Main(string[] args)
    
{
         
string str = "<You're angle & evil>";
         
string result;

         
//假设特殊字符只有< > ' & 四种
     string pattern = "<|>|'|&":
         Regex regex 
= new Regex(pattern);

         
//假设我们只把他们都替换成  '_'
         result = regex.Replace(str, "_");
         Console.WriteLine(result);
    }

}


//结果很明显
_You_re angle _ evil_

按情况替换为不同的字符

但我遇到的问题是, 我可不想把他们简单的替换成一个没意义的下划线,我想把他们转化为xml能识别的格式。

不幸地,Replace可不直接提供替换为多个目标字符的功能。

于是, 我们可以用到一个叫MatchEvaluatord的类来帮我们解决问题。如下:

using System.Text.RegularExpressions;

class Program
    
{
        
static void Main(string[] args)
        
{
            
string str = "<You're angle & evil>";
            
string pattern = "'|&|<|>";

            Regex regex 
= new Regex(pattern);

            Program prog 
= new Program();
            MatchEvaluator evaluator 
= new MatchEvaluator(prog.ConvertToXML);
            Console.WriteLine(regex.Replace(str, evaluator));
            Console.Read();
        }


        
//把正则表达式的匹配到的字符转换成xml能正常识别的标识
        public string ConvertToXML(Match m)
        
{
            
switch (m.Value)
            
{
                
case "'":
                    
return "&apos";
                
case "&":
                    
return "&amp";
                
case "<":
                    
return "&lt";
                
case ">":
                    
return "&gt";
                
default:
                    
return "";                    
            }

        }

    }

不知此法是否最佳, 还望各位赐教.


----------------------------------------


Regex..::.Replace 方法 (String, MatchEvaluator)

在指定的输入字符串内,使用 MatchEvaluator 委托返回的字符串替换与指定正则表达式匹配的所有字符串。

命名空间:  System.Text.RegularExpressions
程序集:  System(在 System.dll 中)

Visual Basic(声明)
Public Function Replace ( _
input As String, _
evaluator As MatchEvaluator _
) As String
Visual Basic(用法)
Dim instance As Regex
Dim input As String
Dim evaluator As MatchEvaluator
Dim returnValue As String
returnValue = instance.Replace(input, _
evaluator)
C#
public string Replace(
string input,
MatchEvaluator evaluator
)
Visual C++
public:
String^ Replace(
String^ input,
MatchEvaluator^ evaluator
)
J#
public String Replace(
String input,
MatchEvaluator evaluator
)
JScript
public function Replace(
input : String,
evaluator : MatchEvaluator
) : String

参数

input
类型:System..::.String

要搜索匹配项的字符串。

evaluator
类型:System.Text.RegularExpressions..::.MatchEvaluator

一个自定义方法,它检查每个匹配项,并返回原始匹配字符串或替换字符串。

返回值

类型:System..::.String

一个与输入字符串基本相同的新字符串,唯一的差别在于,其中的每个匹配字符串已被替换字符串代替。

异常 条件
ArgumentNullException

inputnullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing

- 或 -

evaluatornullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing

该正则表达式采用由当前 Regex 对象的构造函数定义的模式。evaluator 参数是您定义的用于检查每个匹配项的自定义方法的委托。您的自定义方法将返回替换了匹配输入的字符串。

下面的代码示例显示一个原始字符串,对该原始字符串中的每个单词进行匹配,将每个匹配项的第一个字符转换为大写,然后显示转换后的字符串。

Visual Basic
Imports System
Imports System.Text.RegularExpressions
Module RegExSample
Function CapText(ByVal m As Match) As String
' Get the matched string.
Dim x As String = m.ToString()
' If the first char is lower case...
If Char.IsLower(x.Chars(0)) Then
' Capitalize it.
Return Char.ToUpper(x.Chars(0)) & x.Substring(1, x.Length - 1)
End If
Return x
End Function
Sub Main()
Dim text As String = "four score and seven years ago"
System.Console.WriteLine("text=[" & text & "]")
Dim rx As New Regex("\w+")
Dim result As String = rx.Replace(text, AddressOf RegExSample.CapText)
System.Console.WriteLine("result=[" & result & "]")
End Sub
End Module
using System;
using System.Text.RegularExpressions;
class RegExSample
{
static string CapText(Match m)
{
// Get the matched string.
string x = m.ToString();
// If the first char is lower case...
if (char.IsLower(x[0]))
{
// Capitalize it.
return char.ToUpper(x[0]) + x.Substring(1, x.Length - 1);
}
return x;
}
static void Main()
{
string text = "four score and seven years ago";
System.Console.WriteLine("text=[" + text + "]");
Regex rx = new Regex(@"\w+");
string result = rx.Replace(text, new MatchEvaluator(RegExSample.CapText));
System.Console.WriteLine("result=[" + result + "]");
}
}

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360

 

.NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

.NET Framework

受以下版本支持:3.5、3.0 SP1、3.0、2.0 SP1、2.0、1.1、1.0

.NET Compact Framework

受以下版本支持:3.5、2.0、1.0

XNA Framework

受以下版本支持:1.0

posted on 2008-05-17 11:20  new2008  阅读(8171)  评论(0编辑  收藏  举报

导航