【问题标题】:Regex match zero or one time a string正则表达式匹配字符串零次或一次
【发布时间】:2021-02-01 07:00:37
【问题描述】:

我正在尝试创建一个匹配此字符串 {Date HH:MM:ss} 的正则表达式,但诀窍是:HH、MM 和 ss 是可选的,但它必须是“HH”,而不仅仅是“H” "(同样适用于 MM 和 ss)。如果出现单个“H”,则不应匹配该字符串。

我知道我可以使用 H{2} 来匹配 HH,但我似乎无法使用该功能加上 ? 来匹配零次或一次(零是因为它是可选的,并且最多一次)。

到目前为止,我正在这样做(这显然不起作用):

Regex dateRegex = new Regex(@"\{Date H{2}?:M{2}?:s{2}?\}");

下一个问题。现在我已经在第一个字符串上找到了匹配项,我只想将 HH:MM:ss 部分放入另一个字符串中(这将是 TimeStamp 对象的格式)。

我用了同样的方法,像这样:

Regex dateFormatRegex = new Regex(@"(HH)?:?(MM)?:?(ss)?");

但是当我在“{Date HH:MM}”上尝试时,我没有得到任何匹配。为什么?

如果我添加这样的空格Regex dateFormatRegex = new Regex(@" (HH)?:?(MM)?:?(ss)?");,我有结果,但我不想要空格... 我认为第一个括号需要转义,但\( 在这种情况下不起作用。我猜是因为它不是要匹配的字符串的一部分的括号,而是一个关键字符。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    (H{2})? 匹配零个或两个 H 字符。

    但是,在你的情况下,写两次会更易读:

    Regex dateRegex = new Regex(@"\{Date (HH)?:(MM)?:(ss)?\}");
    

    除此之外,请确保没有可用于您尝试执行的任何功能。解析日期非常普遍,大多数编程语言在其标准库中都有函数 - 我几乎可以打赌 .NET 也有这样的函数。

    【讨论】:

    • 我正在为文件重命名创建一个自定义的小“语言”,这里的日期不是指一个 DateTime 对象,而是一个包含在自定义对象中的日期。
    • 这在主字符串上完美运行,请参阅我更新的问题,了解之后发生的非常相似的问题。
    • 无论如何使用 .NET 库可能是值得的。
    【解决方案2】:

    在您的编辑中,您在结果中提到了一个不需要的前导空格......要检查前导或尾随条件以及您的正则表达式而不将其包含在结果中,您可以使用正则表达式的环视功能。

    new Regex(@"(?<=Date )(HH)?:?(MM)?:?(ss)?")
    

    (?

    Regex test site 这个例子。

    对于输入 Date HH:MM:ss,它将匹配两个正则表达式(有或没有后向)。

    但是输入 FooBar HH:MM:ss 仍然会匹配一个简单的正则表达式,但这里的lookbehind 会失败。 Lookaround 不会更改结果的内容,但它可以防止错误匹配(例如,第二个输入不是日期)。

    查找有关正则表达式和环视here 的更多信息。

    【讨论】:

    • 我不确定我是否理解这种lookbehind 模式的目的,请您进一步解释一下吗?
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多