-1

我需要一个 RegEx 模式,它允许我将一组字符替换为另一组对应的字符。例如:set [abcdefg],应该用 set [1234567] 替换......所以在“bag”字符串中,我希望我的替换是“217”。

Regex regX = new Regex("([abcdefg])([1234567])");
string result = regX.Replace("bag", "$1$2");

我的结果与来源相同。我的替换模式应该是什么?

4

4 回答 4

2

像这样的东西会比正则表达式好得多:

var fromCharacters = "abcdefghijklmnopqrstuvwxyz";
var toCharacters = "12345678901234567890123456";

var myString = "bag";

var sb = new StringBuilder(myString.Length);
for (int i = 0; i < myString.Length; ++i)
{
    sb.Append(toCharacters[fromCharacters.IndexOf(myString[i])]);
}

sb.ToString().Dump();

如果你想,你可以做类似的事情,例如,'j'变成'10',但你需要一个字符串数组,而不是能够将字符串用作字符数组。

我不确定您将如何使用正则表达式执行此操作,但我知道您不应该这样做。

于 2013-02-07T02:16:08.413 回答
2
string result = Regex.Replace("abcdefghiABCDEFGHI", "[a-zA-Z]", 
    m => (('a' <=  m.Value[0] && m.Value[0] <= 'z' 
               ? m.Value[0] - 'a' 
               : m.Value[0] - 'A') + 1).ToString());

Console.WriteLine(result);
// 123456789123456789

我使用MatchEvaluator委托将每个匹配项替换为相应的值。有关它的另一个示例,请参见this

您的模式的问题是没有人期望输入字符串中的数字,因此它不应该成为模式的一部分。

于 2013-02-07T02:16:40.113 回答
0

我会Dictionary<char, char>在这里使用 for chars 匹配:

var dict = "abcdefg"
    .Zip("1234567", (k, v) => new { k, v })
    .ToDictionary(i => i.k, i => i.v);
var result = string.Concat("bag".Select(c => dict[c]));

这会让你:

217
于 2013-02-07T08:50:48.523 回答
-1

你还没有提到一种语言,我会告诉你如何在 php 中做到这一点。您可以根据自己的需要进行修复。在您更换的情况下,您的参数应该是数组。
$num = 数组(“1”、“2”、“3”、“4”、“5”、“6”、“7”);
$chr = 数组(“a”、“b”、“c”、“d”、“e”、“f”、“g”);

然后你可以使用 str_replace 或 preg_replace
$str = "This is a sample text";
回声 str_replace($chr, $num, $str);

在这种情况下,您可以将正则表达式用作模式的第一个参数,但不能用于字符串。

于 2013-02-07T01:58:22.823 回答