【问题标题】:regex for extracting a number用于提取数字的正则表达式
【发布时间】:2014-07-28 13:37:57
【问题描述】:

我有一个输入字符串列表,如下所示: “加内容” “PlusArchieve” “加内容1” "PlusArchieve1"

等等,这意味着总是有两个条目构成一个主题{content,archieve}。现在我想在该字符串的末尾获取数字(我们称之为后缀)。为此,我使用了以下正则表达式:

Regex r = new Regex(@"Plus.+?(\d*)$", RegexOptions.IgnoreCase);

现在我循环匹配(应该最多 2 个,第一个是整个字符串,第二个是实际匹配(如果存在))。

foreach (Match m in r.Matches(tester)) Console.WriteLine(m);

其中 tester 是我列表中的当前字符串。但结果我总是得到整个字符串,而不是它的后缀。我在regexHero 上测试了相同的正则表达式,它工作...

有什么想法吗?

P.S.:这是完整的代码:

List<string> words = new List<string> { "PlusContent", "PlusArchieve", "PlusContent1", "PlusArchieve1" };
foreach(string tester in words) {
    Regex r1 = new Regex(@"Plus.+?(\d*)$", RegexOptions.IgnoreCase);
    foreach (Match m in r1.Matches(tester)) Console.WriteLine(m);
}

但出于某种奇怪的原因,我只从列表中获取了原始字符串。

【问题讨论】:

  • 点击我在帖子中分享的链接,获取仅被括号(...)捕获的组捕获

标签: c# regex match


【解决方案1】:

尝试捕获组并从索引 1 获取匹配组。

\bPlus\D*(\d*)\b

DEMO

Read more about capturing group

模式说明:

  \b                       the word boundary
  Plus                     'Plus'
  \D*                      non-digits (all but 0-9) (0 or more times (most))
  (                        group and capture to \1:
    \d*                      digits (0-9) (0 or more times (most))
  )                        end of \1
  \b                       the word boundary

【讨论】:

  • 好吧,我也尝试使用索引 1,但这给了我一个 NRE,因为结果集合只有一个元素(整个字符串)...
  • 当我发现正则表达式本身是完全正确的,所以所有的“test-it”提示根本没有用......问题显然是访问组。但是,为第二个链接 +1(我实际上是通过残酷的答案弄清楚的)
  • 我已经明确提到使用索引 1。因为我不是 C# 人。我只知道一点点正则表达式模式,这就是为什么我分享了你的代码链接。
【解决方案2】:

user3218114 的正则表达式是正确的。由于数字是使用分组捕获的,因此您需要使用 Groups 属性访问它们,如下所示:

List<string> words = new List<string> { "PlusContent", "PlusArchieve", "PlusContent1", "PlusArchieve1" };
foreach (string tester in words)
{
    Regex r1 = new Regex(@"\bPlus\D*(\d*)\b", RegexOptions.IgnoreCase);
    foreach (Match m in r1.Matches(tester)) Console.WriteLine(m.Groups[1]);
}

在这种情况下,m.Group[0] 是原始字符串内容,而 m.Group[1] 是正则表达式中指定的分组。

【讨论】:

    【解决方案3】:

    这可能有助于短正则表达式,它将获取任何字符串中的数字作为后缀。

    \bPlus\D+(\d*)
    

    这里是Demo

    如果您使用的是正则表达式,那么您可以使用上述正则表达式获取 $1 中的数字。

    List<string> words = new List<string> { "PlusContent", "PlusArchieve", "PlusContent1", "PlusArchieve1" };
            foreach (string tester in words)
            {
                Regex r1 = new Regex(@"\bPlus\D+(\d*)", RegexOptions.IgnoreCase);
                foreach (Match m in r1.Matches(tester))
                {
                    //Console.WriteLine(m);
                    if (!string.IsNullOrEmpty(Regex.Replace(tester, @"\bPlus\D+(\d*)", "$1")))
                        Console.WriteLine(Regex.Replace(tester, @"\bPlus\D+(\d*)", "$1"));
                }
            }
    

    【讨论】:

    • 前缀Plus 不见了。该数字应被视为后缀而不是所有单词。
    • 已将代码包中的完整代码更新发送给您,如果解决方案代码适合您,您能否更新投票?附言我已经检查过控制台应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多