正则表达式用于特定要求

时间:2016-11-19 09:26:56

标签: c# .net regex pattern-matching

以下是我的字符串集合,它引用从开始到结束的路径,像ABC这样的每个元素都是城市终端:

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

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

要求1 - Start with ABC or DEF, pass via MNO or BYT, End with 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 - Start with ABC or DEF, pass via MNO or BYT, exclude route with IOT and End with 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$)";`

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

  • 为什么预期模式无助于产生正确的结果,我无法理解其中的错误
  • 建议一个更好的正则表达式来实现相同的结果

修改1:

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

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

但是下面的模式失败了,只有额外的.*

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

2 个答案:

答案 0 :(得分:2)

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

您的伪成功模式使用与(MNO|BYT.*^(IOT))MNO匹配的以下BYT.*^(IOT),因此如果IOT中存在MNO则不会检查^(IOT)你的字符串。另外IOT匹配字符串+ import Foundation import Parse import ParseLiveQuery extension _ArrayProtocol where Iterator.Element == PFObject { mutating func updateWithEvent(event: Event<PFObject>) { switch event { case .created(let object): append(object) case .entered(let object): append(object) case .deleted(let object): if let index = index(of: object) { remove(at: index) } case .left(let object): if let index = index(of: object) { remove(at: index) } case .updated(let object): if let index = index(of: object) { //I got an error : Cannot assign through subscript: subscript is get-only self[index] = object } } } } 的开头,字符串中永远不会出现。

答案 1 :(得分:1)

从ABC或DEF开始:^(?:ABC|DEF)-

通过MNO或BYT传递:(?:MNO|BYT)-

使用物联网排除路线:(?!IOT)-

以LOO,JYY,IRJ结尾:(?:LOO|JYY|IRJ)$

把它们放在一起:

^(?:ABC|DEF)-(?:(?!IOT)[A-Z]{3}-)*?(?:MNO|BYT)-(?:(?!IOT)[A-Z]{3}-)*(?:LOO|JYY|IRJ)$