什么RegEx字符串将找到字符串中的最后一个(最右边)数字组?

时间:2012-01-05 12:40:56

标签: c# regex

寻找一个正则表达式字符串,它可以让我找到嵌入字符串中的最右边(如果有)数字组。我们只关心连续的数字。我们不关心标志,逗号,小数等。如果发现这些,应该只是像字母一样被视为非数字。

这是为了替换/递增目的,所以我们还需要获取检测到的数字之前和之后的所有内容,这样我们可以在递增值后重建字符串,这样我们就需要一个标记化的正则表达式。

以下是我们正在寻找的例子:

  • “abc123def456ghi”应识别'456'
  • “abc123def456ghi789jkl”应该识别'789'
  • “abc123def”应标识'123'
  • “123ghi”应该标识'123'
  • “abc123,456ghi”应该标识'456'
  • “abc-654def”应标识'654'
  • “abcdef”不应该返回任何匹配

作为我们想要的一个例子,它就像从名称'Item 4-1a'开始,在作为前缀之前提取出所有内容的'1'以及作为后缀后的所有内容。然后使用它,我们可以在代码循环中生成值“Item 4-2a”,“Item 4-3a”和“Item 4-4a”。

现在如果我正在寻找第一套,这很容易。我只是找到第一个连续的0个或更多前缀的非数字块,然后是数字的1个或多个连续数字块,那么到目前为止的其他所有内容都将是后缀。

我遇到的问题是如何将前缀定义为包括除最后一组之外的所有(如果有)数字。我尝试使用前缀的所有内容都会吞下最后一组,即使我已经尝试通过基本上颠倒上述内容来将其锚定到最后。

5 个答案:

答案 0 :(得分:13)

怎么样:

^(.*?)(\d+)(\D*)$

然后递增第二组并连续所有3。

<强>解释

^         : Begining of string
  (       : start of 1st capture group
    .*?   : any number of any char not greedy
  )       : end group
  (       : start of 2nd capture group
    \d+   : one or more digits
  )       : end group
  (       : start of 3rd capture group
    \D*   : any number of non digit char
  )       : end group
$         : end of string

第一个捕获组将匹配所有字符,直到字符串结尾之前的最后一组数字的第一个数字。

或者如果您可以使用命名组

^(?<prefix>.*?)(?<number>\d+)(?<suffix>\D*)$

答案 1 :(得分:6)

尝试下一个正则表达式:

(\d+)(?!.*\d)

说明:

(\d+)           # One or more digits.
(?!.*\d)        # (zero-width) Negative look-ahead: Don't find any characters followed with a digit.

编辑(问题的OFFTOPIC)::这个答案是不正确的但是这个问题已经在其他帖子中得到了回答,所以为了避免删除这个,我将使用相同的正则表达式,例如Perl中的C#可以像s/(\d+)(?!.*\d)/$1 + 1/e; 一样获得相同的结果(增加最后一位数字):

{{1}}

答案 2 :(得分:3)

您也可以尝试更简单的版本:

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

答案 3 :(得分:1)

这应该这样做:

Regex regexObj = new Regex(@"
    # Grab last set of digits, prefix and suffix.
    ^               # Anchor to start of string.
    (.*)            # $1: Stuff before last set of digits.
    (?<!\d)         # Anchor start of last set of digits.
    (\d+)           # $2: Last set of one or more digits.
    (\D*)           # $3: Zero or more trailing non digits.
    $               # Anchor to end of string.
    ", RegexOptions.IgnorePatternWhitespace);

答案 4 :(得分:1)

如何不使用正则表达式。这是代码片段(用于控制台)

string[] myStringArray = new string[] { "abc123def456ghi", "abc123def456ghi789jkl", "abc123def", "123ghi", "abcdef","abc-654def" };

        char[] numberSet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] filterSet = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m',
                                        'n','o','p','q','r','s','t','u','v','w','x','y','z','-'};
        foreach (string myString in myStringArray)
        {
            Console.WriteLine("your string - {0}",myString);
            int index1 = myString.LastIndexOfAny(numberSet);
            if (index1 == -1)
            Console.WriteLine("no number");
            else
            {
               string mySubString = myString.Substring(0,index1 + 1);
               string prefix = myString.Substring(index1 + 1);
               Console.WriteLine("prefix - {0}", prefix);
               int index2 = mySubString.LastIndexOfAny(filterSet);
               string suffix = myString.Substring(0, index2 + 1);
               Console.WriteLine("suffix - {0}",suffix);
               mySubString = mySubString.Substring(index2 + 1);
               Console.WriteLine("number - {0}",mySubString);
               Console.WriteLine("_________________");
            }
        }
        Console.Read();