以下是我收集的字符串,从头到尾指的是路径,每个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,它永远不会出现在字符串中。
