Skip to main content
 首页 » 编程设计

c#之针对特定需求的正则表达式

2024年04月12日37zlslch

以下是我收集的字符串,从头到尾指的是路径,每个ABC元素都是一个城市终点站:

"ABC-DEF-MNO-JKL-LOO" 
"BYT-JKU-PLO-MNO" 
"DEF-BYT-IOT-POC-LOO" 
"LMN-RTX-PQS-JYY" 
"LMN-PQS-IRJ" 

我开发了以下正则表达式模式来满足业务需求:

要求 1 - 以 ABC 或 DEF 开始,通过 MNO 或 BYT,以 LOO、JYY、IRJ 结束

Pattern 1 - `@"(^ABC|^DEF).*(MNO|BYT).*(LOO$|JYY$|IRJ$)";` 
Result 1 - "ABC-DEF-MNO-JKL-LOO", "DEF-BYT-IOT-POC-LOO" 

要求 2 - 以 ABC 或 DEF 开始,通过 MNO 或 BYT,以 IOT 排除路由,以 LOO、JYY、IRJ 结束

 Expected Result - "ABC-DEF-MNO-JKL-LOO", since the other route has IOT 
 
Expected Pattern - `@"(^ABC|^DEF).*(MNO|BYT).*^(IOT).*(LOO$|JYY$|IRJ$)";` 

但是这个没有提供任何结果

Successful Pattern - `@"(^ABC|^DEF).*(MNO|BYT.*^(IOT)).*(LOO$|JYY$|IRJ$)";` 

但是我不相信,这是实现它的正确方法,任何人都可以帮助理解:

  • 为什么 Expected Pattern 不能帮助产生正确的结果,我不明白其中有什么问题
  • 建议更好的正则表达式以获得相同的结果

编辑 1:

根据@Sebastian 提供的响应,以下模式也成功:

@"^(?:ABC|DEF).*(?:MNO|BYT)(?!.*IOT).*(?:LOO|JYY|IRJ)$"

但是当只有额外的 .*

时,以下模式会失败

@"^(?:ABC|DEF).*(?:MNO|BYT).*(?!.*IOT).*(?:LOO|JYY|IRJ)$"

请您参考如下方法:

你可以使用 ^(?:ABC|DEF)(?!.*IOT).*(?:MNO|BYT).*(?:LOO|JYY|IRJ)$满足你的第二个要求。这使用 negative lookahead避免匹配,如果 IOT 存在。其余部分取自您的模式,只是使组不捕获并将 anchor 移到组外。

您的伪成功模式使用以下 (MNO|BYT.*^(IOT)) 匹配 MNO 或 BYT.*^(IOT) ,因此如果字符串中存在 MNO,则不会检查 IOT。此外,^(IOT) 匹配字符串的开头 + IOT,它永远不会出现在字符串中。