正则表达式匹配单个字符或转义字符

时间:2015-10-04 23:43:58

标签: c# regex

我正在尝试编写我自己的Format代码,这是一个类项目,但Format是我自己用C#Regex更多地工作的。所以我想要做的就是匹配某些角色。

W w : w = weeks. W weeks preceded by a leading zero if smaller than 10
D d : d = days. D days preceded by a leading zero if smaller than 10
G g : g = Military Hours: G hours preceded by a leading zero if smaller than 10
H h : h = Civilian Hours: H hours preceded by a leading zero...
m : m = minutes
s : s = seconds

所以到目前为止我的正则表达式是

(w|W)(?=\b)|(d|D)(?=\b)|(h|H|g|G)(?=\b)|(m)(?=\b)|(s)(?=\b)

(w|W) //match upper or lower W
(?=\b) //positive lookahead only match if not apart of a word boundary

如果它与字符串中的所有s匹配,那么我当然会相信我的正则表达式是错误的。 我的问题是,我不确定如何正确地进行前瞻和后视。我基本上只想要我提供的字符的情况,只有它们本身或转义时才会看到以下示例。

Format("w Weeks, D days, h:m:s");
//returns 7 Weeks, 04 days, 10:01:05
Format("[w] weeks [d] days H:m:s");
//returns [7] weeks [4] days 10:01:05
Format("w \Weeks D \days, h:m:s");
//returns 7 07eeks 04 4ays, 10:01:05

正如你可以看到转义w和d的最后一种格式,它仍然取代它们。这就是我想要的。我再也不确定如何正确地编写前瞻和后视。

我在这里使用https://regex101.com/r/sL9cI2/1 regex101进行测试。你可以看到它和发生了什么。任何建议请。

1 个答案:

答案 0 :(得分:2)

关于word boundaries的一件事是它们匹配空字符串\b匹配某个位置,而不是字符,其中一方有 word character ,而且它没有 word character 另一方面。例如,在"This is an example"中,有8个与\b匹配的位置:

|This| |is| |an| |example|

| ::: denotes a word boundary

要匹配单词,正则表达式应检查每一侧是否有单词边界:\bword\b(注意这里不需要前瞻)。

  

我基本上只想要我提供的字符的情况,并且只有他们自己或逃脱

然后您有两个匹配选项:

  1. \bw\b字母“w”为单词。
  2. \\w反斜杠(你需要在正则表达式中转义反斜杠)后跟字母w。
  3. 正则表达式:

    (\bw\b|\\w)
    

    此外,看看你的尝试,我认为你可以使用character class来简化模式。

    <强>正则表达式:

    (\b[WwDdGgHhms]\b|\\[WwDdGgHhms])
    

    regex101 Demo

    • 请注意,此正则表达式不会验证连续的反斜杠,这意味着我们无法在格式代码前面可靠地指定反斜杠。

      \\week为例,它被解释为\,后跟周格式代码,然后是文字字符串eek,而不是文字\,后跟文字字符串{{ 1}}。

    如果要支持此类用例,请使用以下正则表达式:

    week

    regex101 Demo