C# ReEX-查找和替换而忽略中间的数字?

C# ReEX-查找和替换而忽略中间的数字?,c#,regex,C#,Regex,在一根长长的绳子中间,我在找“1234号” 上面示例中的数字(1234)可以是任意长度的整数。它还必须匹配末端的空间 因此,我正在寻找一些例子: 1) 这是第42项测试。你好,好人 2) 我不知道世贸基金会1234412344124号。我正在做 我已经找到了一种方法,可以将此模式与以下正则表达式匹配: (编号:[\d]{1,}.)' 不过,我不知道在查找匹配项时如何做一件简单的事情:用一个该死的逗号替换最后一个句点 因此,通过上面的两个示例,我想将它们转换为: 1) 这是第42题,你好,好人 2

在一根长长的绳子中间,我在找“1234号”

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

因此,我正在寻找一些例子:

1) 这是第42项测试。你好,好人
2) 我不知道世贸基金会1234412344124号。我正在做

我已经找到了一种方法,可以将此模式与以下正则表达式匹配: (编号:[\d]{1,}.)'

不过,我不知道在查找匹配项时如何做一件简单的事情:用一个该死的逗号替换最后一个句点

因此,通过上面的两个示例,我想将它们转换为:

1) 这是第42题,你好,好人
2) 我不知道世跆联1234412344124号,我在做什么

(注意数字后面的逗号)

在C#和RegEx中如何做到这一点?谢谢大家!

编辑: 另一种看待这个问题的方式是

我可以轻松做到这一点,并且多年来: str=Replace(str,“找到这个”,“用这个替换它”)

< >但是,如何将ReGEX和中间字符串的未知部分结合起来替换最后一个周期(与最后一个字符仍然混淆,因为最后一个字符仍然需要是一个空间)

  • 这是第42项测试。你好,好人
  • 这是一个测试编号(未知长度编号)。你好,好人
  • 变成
  • 这是42号考试,大家好
  • 这是一个测试号(一些未知长度的数字),你好,好人
(注意逗号)

编辑-#1:

尼尔的方法好多了

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

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]。索引+match.Groups[1]。长度

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

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

    stringhe[idx] = builder.ToString();
    Console.WriteLine("New String: " + stringhe[idx]);
}
或者,我们可以编辑正则表达式,仅当数字后面有逗号时才进行检测(无论如何更好)


我不是正则表达式的高手,但这应该是你想要的

No.\s+([0-9]+)
如果在编号{NUMBER}之间不包含零个或多个空格,则此正则表达式应执行以下操作:

No.\s*([0-9]+)
如何显示C代码的示例:


因此,您实际上是在尝试匹配两个相邻的组“\d+”和“.”。然后将第二个组替换为“,”

使用括号匹配两个组,然后替换为保留第一个组并将其转储到“,”中

编辑:derp,逃出那个周期。

下面是代码:

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, ",");
    }

非常感谢。然而,真正的问题是我问题的第二部分,那就是如何用逗号替换比赛中的最后一个句号?这太好了!你说得对。如果这不是显而易见的,我应该说我是新加入RegEx的。但是,是的,你刚刚认识到并解决了我的问题!我甚至不知道“团体”,我需要阅读/学习一些正则表达式。非常感谢你,neilh。嘿@neilh,我今天注意到这有一个小缺陷,我无法通过。。。如果匹配长度超过1位的数字,则只替换第一位数字。示例:“No.422.”变为“No.4”,并忽略其他数字。思想?再次感谢你,老兄@用户3038032,你能发布你正在使用的代码吗?我在复制您描述的行为时遇到困难。var r=new Regex(@“(No.\d+)”);var输出=r.Replace(strName,$1,);返回输出;再次感谢你,尼尔。我仍在努力。我还是不明白。
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;
}
var r = new Regex(@"(\d+)(\. )");
var input = "This is a test No. 42. Hello Nice People";
var output = r.Replace(input, "$1, ");
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, ",");
    }