我正在尝试编写我自己的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进行测试。你可以看到它和发生了什么。任何建议请。
答案 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
(注意这里不需要前瞻)。
我基本上只想要我提供的字符的情况,并且只有他们自己或逃脱
然后您有两个匹配选项:
\bw\b
字母“w”为单词。\\w
反斜杠(你需要在正则表达式中转义反斜杠)后跟字母w。正则表达式:
(\bw\b|\\w)
此外,看看你的尝试,我认为你可以使用character class来简化模式。
<强>正则表达式:强>
(\b[WwDdGgHhms]\b|\\[WwDdGgHhms])
请注意,此正则表达式不会验证连续的反斜杠,这意味着我们无法在格式代码前面可靠地指定反斜杠。
以\\week
为例,它被解释为\
,后跟周格式代码,然后是文字字符串eek
,而不是文字\
,后跟文字字符串{{ 1}}。
如果要支持此类用例,请使用以下正则表达式:
week