4

我的大脑一定很疲惫,但我无法让它工作,而且我对正则表达式的经验很少。

我有一个字符串,例如“gfdsgfd354gfdgfd55gfdgfdgfs9gfdgsf”。

我需要一个正则表达式来查找字符串中的最后一位数字——在本例中为“9”。

编辑

我应该更清楚,但正如我所说,我很疲惫。

它是在最后一个数字之前插入一个连字符。我正在使用 C# Regex.Replace。使用 Dave Sexton 已经提出的想法,我尝试了以下方法但没有成功:

    private string InsertFinalDigitHyphen(string data)
    {
        return Regex.Replace(data, @"(\d)[^\d]*$", " $1");
    }

有了这个,我可以处理“ABCDE1FGH”以得到“ABCDE-1FGH”,但我实际上得到了“ABCDE-1”。

4

4 回答 4

5

我总是发现正则表达式难以阅读,因此您可以使用以下 LINQ 语句以另一种方式进行操作:

string str = "gfdsgfd354gfdgfd55gfdgfdgfs9gfdgsf";
var lastDigit = str.Last(char.IsDigit);

输出:

9

要在此之前插入连字符,您可以使用LastIndexOf代替Last并使用该索引在字符串中的正确位置插入连字符。

于 2013-06-11T13:56:24.030 回答
4

你可以使用这个:

(\d)[^\d]*$

编辑 :

您最初只提到了匹配,没有语言,也没有替代。对于您的 C# 替换,您应该使用

private string InsertFinalDigitHyphen(string data) {
    return Regex.Replace(data, @"(\d)(\D*)$", " $1$2");
}
于 2013-06-11T13:48:00.727 回答
1

如果它是您想要的最后一个数字,请使用:

(\d)[^\d]*$

如果它是最后一组数字,那么使用这个:

(\d+)[^\d]*$

编辑:

您需要选择捕获组(括号中的位) - 对于 c#,我认为它会是这样的:

Regex.Matches("gfdsgfd354gfdgfd55gfdgfdgfs9gfdgsf", '(\d)[^\d]+$')[0].Groups[1].Captures[0].Value

或者,为了避免捕获组,您可以像这样使用正则表达式背后的外观:

\d(?=[^\d]+$)
于 2013-06-11T13:52:31.817 回答
0

您也可以使用String.LastIndexOfAny执行此操作:

private string InsertFinalDigitHyphen(string data)
{
    int lastDigit = data.LastIndexOfAny(new char[] {'0','1','2','3','4','5','6','7','8','9']);
    return (lastDigit == -1) ? data : data.Insert(lastDigit, "-");
}
于 2013-06-11T14:46:29.263 回答