以下是我的字符串集合,它引用从开始到结束的路径,像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)$"
答案 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)$