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

本文关键字:转义字符 正则表达式 字符 单个 | 更新日期: 2023-09-27 18:15:54

我想写我自己的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匹配字符串中的所有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在这里测试。你可以看到它和正在发生的事情。

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

关于字边界的一件事是它们匹配一个空字符串'b匹配一个位置,而不是一个字符,其中它的一侧有字字符,而另一侧没有字字符。例如,在"This is an example"中,有8个位置与'b匹配:

|This| |is| |an| |example|
| ::: denotes a word boundary

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

我基本上只需要我提供的字符的大小写,并且只需要它们本身或转义

然后你有两个选项来匹配:

  1. 'bw'b字母"w"作为单词。
  2. ''w一个反斜杠(在regex中需要转义反斜杠)后面跟着字母w。

正则表达式:

('bw'b|''w)

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


正则表达式:

('b[WwDdGgHhms]'b|''[WwDdGgHhms])
<<p> regex101演示/kbd>
  • 请注意,这个正则表达式不验证连续的反斜杠,这意味着我们不能可靠地在格式代码前面指定反斜杠。

    ''week为例,它被解释为'后跟周格式代码,然后是字面值字符串eek,而不是字面值'后跟字面值字符串week

如果你想支持这样的用例,请使用以下正则表达式:

'G(?:[^'']|''.)*?('b[WwDdGgHhms]'b|''[WwDdGgHhms])
<<p> regex101演示/kbd>