恰好与正则表达式匹配一次

Gau*_*123 5 c# regex

考虑M,T,W,TH,F,S,SU是星期几.

我有正则表达式这是除了一个场景运作良好时,有没有平日的序列,即不存在M, T,W,TH,F,S,SU在字符串中预期的位置.

例如,q10MT有效但q10HT无效.

以下是我的表达:

string expression = "q(\\d*)(M)?(T(?!H))?(W)?(TH)?(F)?(S(?!U))?(SU)?";
Run Code Online (Sandbox Code Playgroud)

如果是q10MT,输出是q10MT正确的,但是如果q10HT输出q10不正确,我的正则表达式应该在没有匹配时不返回值或空字符串.

为实现这一目标,我需要做出哪些改变?

Wik*_*żew 5

您可以通过积极的预测来实现它:

q(\\d*)(?=(?:M|T(?!H)|W|TH|F|S(?!U)|SU))(M)?(T(?!H))?(W)?(TH)?(F)?(S(?!U))?(SU)?
Run Code Online (Sandbox Code Playgroud)

或者,正如@Taemyr所说,更短的等价物

q(\\d*)(?=(?:M|TH?|W|TH|F|SU?))(M)?(T(?!H))?(W)?(TH)?(F)?(S(?!U))?(SU)?
Run Code Online (Sandbox Code Playgroud)

这是一个演示

(?=(?:M|TH?|W|F|SU?))先行确保有至少一个从你先行之后交替列表中选择所需的值.

C#正则表达式用法:

var rx = new Regex(@"q(\d*)(?=(?:M|TH?|W|TH|F|SU?))(M)?(T(?!H))?(W)?(TH)?(F)?(S(?!U))?(SU)?");
var result = rx.Match("q10MSUT").Value;
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述