我试图在reg替换中使用匿名方法将每个字符转换为alpahbet的下一个字母。我收到错误"无法将匿名方法转换为int类型,因为它不是委托类型"。以下是代码。
using System;
using System.Text.RegularExpressions;
namespace LetterChange
{
class Program
{
public static string LetterChanged(string str) {
string changed = null;
changed = Regex.Replace(str, @"[a-zA-z]",
delegate(char c) { if (c == 'z' || c == 'Z') return 'A'; else convert.ToChar(Convert.ToInt32(c));});
return changed;
}
static void Main(string[] args)
{
Console.WriteLine(LetterChanged("hello*3"));
Console.Read();
}
}
}
答案 0 :(得分:0)
Replace
方法需要MatchEvaluator
:
string MatchEvaluator(Match match)
因此需要Match
具有Value
属性来表示匹配的字符串,并返回一个字符串:
var changed = Regex.Replace(str, @"[a-zA-z]",
delegate (Match c) {
if (c.Value == "z" || c.Value == "Z")
{
return "A";
}
else
{
return Convert.ToChar(Convert.ToInt32(c)).ToString();
}
});
此外,我会使用lambda推断参数类型而不必编写类型,不建议使用delegate
语法:
var changed = Regex.Replace(str, @"[a-zA-z]", c => { … });
答案 1 :(得分:0)
您的匹配评估者委托与MatchEvaluator
期望的Regex.Replace
签名不符。这将编译:
return Regex.Replace(
str
, @"[a-zA-z]"
, delegate(Match m) {
int pos = char.ToUpper(m.Value[0]) - 'A';
pos = (pos+1) % 26; // Use % for wrapping around
return ((char)('A'+pos)).ToString();
}
);
但是,这是使用正则表达式使事情更少清除的情况之一。在字符数组或字符串构建器中逐个修改字符的简单循环将是一种更具可读性的替代方法:
char[] txt = str.ToCharArray();
for (int i = 0 ; i != txt.Length ; i++) {
char c = char.ToUpper(txt[i]);
if (c < 'A' || c > 'Z') continue;
int pos = (c - 'A' + 1) % 26;
txt[i] = (char)('A' + pos);
}
str = new string(txt);