【问题标题】:Regex issue i am stuck with我被困住的正则表达式问题
【发布时间】:2015-05-20 10:04:35
【问题描述】:

我必须编写一个正则表达式来匹配模式1-6/2011。 在这种情况下,/ 之前的数字不能大于12。 所以我必须在1-12 之间选择数字。

我写了一个正则表达式:

^[1-9][0-2]?\s*[-−—]\s*[1-9][0-2]?\s*/\s*2[01][0-9][0-9]$

但是,我在这里也得到了 20-6/2014 作为比赛。

我尝试了消极的后视:

^[1-9](?<![2-9])[0-2]?\s*[-−—]\s*[1-9](?<![2-9])[0-2]?\s*/\s*2[01][0-9][0-9]$

在这里,单个数字没有被识别。

【问题讨论】:

  • 更多使用|。您可以像这样匹配所有数字 1-12:([1-9]|1[0-2])

标签: c# regex lookbehind negative-lookbehind


【解决方案1】:

您可以使用以下正则表达式更新:

^(?:0?[1-9]|1[0-2])\s*[-−—]\s*(?:0?[1-9]|1[0-2])\s*/\s*\s*2[01][0-9]{2}$

demo

它将不匹配12-30/201412-31/201412-32/201413-31/201420-6/2014

它将匹配 1-6/201102-12/2014

C#:

var lines = "1-6/2011\r\n02-12/2014\r\n12-30/2014\r\n12-31/2014\r\n12-32/2014\r\n13-31/2014\r\n20-6/2014";
var finds = Regex.Matches(lines, @"^(?:0?[1-9]|1[0-2])\s*[-−—]\s*(?:0?[1-9]|1[0-2])\s*/\s*\s*2[01][0-9]{2}\r?$", RegexOptions.Multiline);

请注意,\r? 仅在我们打开多行模式进行测试时才需要。您可以在检查单独的值时将其删除。

【讨论】:

  • 我只需要 1-12 两种情况。写了这个。 ^(?:0?[1-9]|1[0-2])\s*[--—]\s*(?:0?[1-9]|1[0-2])\s */\s*\s*2[01][0-9][0-9]$
  • 它是否解决了您的问题,还是您需要更多帮助?
  • 哦,对不起,请看你的最后评论,是的,我的问题得到了解决。我在 expresso 中尝试过并检查了 debugex
  • 那么,如果它对您有用,请考虑接受答案。
【解决方案2】:

所以我必须选择 1-12 之间的数字

为此,您可以使用正则表达式

(?:0?[1-9]|1[0-2])

查看演示。

https://www.regex101.com/r/fJ6cR4/23

【讨论】:

  • 这个正则表达式似乎有问题,当我为完整匹配编写完整的正则表达式时,它给了我超时,即。 1-6/2011
【解决方案3】:

你可以使用这个正则表达式:

^(?:[1-9]|1[0-2])\s*-\s*(?:[1-9]|1[0-2])\s*/\s*2[01]\d{2}$

RegEx Demo

【讨论】:

  • 我要超时了。
  • 检查了您的站点链接。当我添加更多类型的连字符时,它会超时,导致正则表达式执行时间超过 2 秒。我用 expresso 试过了,很好。
  • 很难想象这个正则表达式的执行时间是 2 秒,因为这是非常基本和简单的正则表达式。如果你提供一些例子来重现这种缓慢,那么我可以看看。
  • 感谢 anubhava,我在 expresso 工具和 debuggex 中尝试过。它工作正常。
【解决方案4】:

与 1-12 匹配的最简单正则表达式是 (1[0-2]?)|[2-9]

它与13 匹配,因为1[0-2]?1 匹配,但在完整的正则表达式(1[0-2]?)|[2-9]\/\d\d\d\d 中并不重要。

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多