匹配单个字符或转义字符的正则表达式
本文关键字:转义字符 正则表达式 字符 单个 | 更新日期: 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
(注意这里不需要查找)。
我基本上只需要我提供的字符的大小写,并且只需要它们本身或转义
然后你有两个选项来匹配:
-
'bw'b
字母"w"作为单词。 -
''w
一个反斜杠(在regex中需要转义反斜杠)后面跟着字母w。
正则表达式:
('bw'b|''w)
此外,看看你的尝试,我认为你可以使用字符类来简化模式。
正则表达式:
('b[WwDdGgHhms]'b|''[WwDdGgHhms])
<<p> regex101演示/kbd> 请注意,这个正则表达式不验证连续的反斜杠,这意味着我们不能可靠地在格式代码前面指定反斜杠。
以
''week
为例,它被解释为'
后跟周格式代码,然后是字面值字符串eek
,而不是字面值'
后跟字面值字符串week
。
如果你想支持这样的用例,请使用以下正则表达式:
'G(?:[^'']|''.)*?('b[WwDdGgHhms]'b|''[WwDdGgHhms])
<<p> regex101演示/kbd>