RegEx - 查找并替换而忽略中间的数字?

时间:2013-11-26 19:58:18

标签: c# regex

在长串的中间,我正在寻找“第1234号”。

上面示例中的数字(1234)可以是任意长度的整数。它也必须匹配最后的空间。

所以我正在寻找例子:

  

1)这是第42号测试。你好人   2)我不知道wtf No. 1234412344124.我在做。

我已经找到了一种方法来匹配这个模式与以下正则表达式: (不。[\ d] {1,}。)'

但我无法弄清楚的是,在找到匹配项时如何做一件简单的事情:用逗号逗号替换最后一段时间!

所以,有了上面的两个例子,我想将它们转换成:

  

1)这是第42号测试,Hello Nice People
  2)我不知道wtf No. 1234412344124,我在做。

(注意数字之后的逗号)

如何在C#和RegEx中执行此操作?谢谢!

编辑: 另一种看待这种情况的方式是......

我可以轻松地做到这一点,并且多年来: str =替换(str,“查找此”,“替换为此”)

但是,如何通过将正则表达式和中间字符串的未知部分组合来替换最后一个句点(不要与最后一个字符混淆,因为最后一个字符仍然需要是一个空格) p>

  • 这是第42号测试。你好好人
  • 这是一个测试编号(某个未知的长度编号)。 Hello Nice People
  • 变为
  • 这是第42号测试,Hello Nice People
  • 这是一个测试编号(一些未知的长度编号),Hello Nice People

(注意逗号)

3 个答案:

答案 0 :(得分:1)

修改 - #1:

neilh的方式要好得多!

好的,我知道代码看起来很丑..我不知道如何在正则表达式中直接编辑匹配的最后一个字符

string[] stringhe = new string[5] {
    "This is a test No. 42, Hello Nice People",
    "I have no idea wtf No. 1234412344124. I am doing.",
    "Very long No.                        74385748957348957893458934; Hello World",
    "Nope No. 48394839!!!",
    "Nope"
};

Regex reg = new Regex(@"No.\s*([0-9]+)");

Match match;
int idx = 0;

StringBuilder builder;
foreach(string stringa in stringhe)
{
    match = reg.Match(stringa);

    if (match.Success)
    {
        Console.WriteLine("No. Stringa #" + idx + ": " + stringhe[idx]);

        int indexEnd = match.Groups[1].Index + match.Groups[1].Length;

        builder = new StringBuilder(stringa);
        builder[indexEnd] = '.';

        stringhe[idx] = builder.ToString();
        Console.WriteLine("New String: " + stringhe[idx]);
    }

    ++idx;
}

Console.ReadKey(true);

如果你想在编号后编辑字符,如果它是',':

int indexEnd = match.Groups [1] .Index + match.Groups [1] .Length;

if (stringa[indexEnd] == ',')
{

    builder = new StringBuilder(stringa);
    builder[indexEnd] = '.';

    stringhe[idx] = builder.ToString();
    Console.WriteLine("New String: " + stringhe[idx]);
}

或者,我们可以编辑正则表达式,只检测数字后面跟一个逗号(反正更好)

No.\s*([0-9]+),

我不是Regex的佼佼者,但这应该做你想要的。

No.\s+([0-9]+)

如果除了{NUMBER}之间的零个或多个空格之外,这个正则表达式应该完成这项工作:

No.\s*([0-9]+)

如何看C#代码的示例:

string[] stringhe = new string[4] {
    "This is a test No. 42, Hello Nice People",
    "I have no idea wtf No. 1234412344124. I am doing.",
    "Very long No. 74385748957348957893458934; Hello World",
    "Nope No. 48394839!!!"
};

Regex reg = new Regex(@"No.\s+([0-9]+)");

Match match;
int idx = 0;
foreach(string stringa in stringhe)
{
    match = reg.Match(stringa);

    if (match.Success)
    {
        Console.WriteLine("No. Stringa #" + idx + ": " + match.Groups[1].Value);
    }

    ++idx;
}

答案 1 :(得分:1)

所以你基本上试图匹配两个相邻的组,“\ d +”和“。”然后用“,”替换第二组。

var r = new Regex(@"(\d+)(\. )");
var input = "This is a test No. 42. Hello Nice People";
var output = r.Replace(input, "$1, ");

使用括号匹配两个组,然后使用replace保留第一个组并转储到“,”。

编辑:derp,逃避那段时间。

答案 2 :(得分:0)

以下是代码:

private string Format(string input)
    {
        Match m = new Regex("No. [0-9]*.").Match(input);

        int targetIndex = m.Index + m.Length - 1;

        return input.Remove(targetIndex, 1).Insert(targetIndex, ",");
    }