【问题标题】:Regex mismatch issue正则表达式不匹配问题
【发布时间】:2015-09-22 00:59:37
【问题描述】:

我在识别字符串中的多字符数字时遇到问题。

我正在尝试从右到左检查第一个数字以进行比较。

我原来的正则表达式:

Regex.Match(s, @"\d{3}", RegexOptions.RightToLeft);

这将匹配它在任何字符串中遇到的前 3 位数字。例如:

  • hello123 - 输出:123
  • good234bye - 输出:234
  • see-you-456-tomorrow - 输出:456

不用担心。但是,现在我们不确定数字的长度,因此我们将正则表达式更改为:

Regex.Match(s, @"\d*", RegexOptions.RightToLeft);

这会查找第一个数字字符串,任何长度,并使用它。 然而,如果数字不在字符串的末尾,它会返回一个空匹配。例如:

  • hello12 - 输出:12
  • 再见-1234 - 输出:1234
  • see-1-you-2-morrow - 输出:无

如何查找字符串中第一个 x 长度的数字,从右到左忽略任何非数字字符,而不返回空匹配项?

【问题讨论】:

  • 你有没有试过像这样使用“全局”:Regex.Match(s, @"\d+g", RegexOptions.RightToLeft);
  • 我没有。那检查什么? (说到正则表达式,我有点新手)
  • 我不确定它在 C# 中的语法,但 g 代表全局搜索

标签: c# regex


【解决方案1】:

量词

一个数字重复一次或多次

\d+

一个数字重复了 3 到 5 次

\d{3,5}

一个数字至少重复 5 次

\d{5,}

你可以在this tutorial阅读更多关于量词的内容


您可能已经意识到,

              see-1-you-2-morrow
                                ^
                                |
\d* matches an empty position (here)
    between the last character and the end of string

【讨论】:

  • 您是在说“重复”...澄清一下您的意思是像“111”这样的“重复”吗?或者只是任何个数字,比如“456”?
  • \d+ 是您想要的。+ 重复正则表达式构造。它将匹配“456
  • \d+ 给了我我需要的东西。谢谢!
【解决方案2】:

你可以试试这个吗?我是 Regex 的新手,但我想它适合你!

 var s =    @"see-you-456-tomorrow";
            var r = Regex.Match(s, @"[[\d]]*\d*", RegexOptions.RightToLeft);
            Console.WriteLine(r);

你可以看到它在工作here

【讨论】:

  • 那个正则表达式的意思是:[[\d]一个数字或一个“[”+]*一个“]”重复一次或多次+ \d* 一个数字一次或多次。针对字符串“see-you-456-tomorrow[”进行测试以查看差异
  • 结果将是 456,第一个匹配项(从右到左)。你想要 Ben & @Mariano 的结果是什么?
  • @ArthurCastro 这是预期的结果,是的。第一次尝试做得很好!
猜你喜欢
  • 2011-07-17
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多