Ios 如何在特定字符串处停止正则表达式并捕获子字符串?
我想捕获正则表达式的两个匹配项之间的字符串 我有这根绳子Ios 如何在特定字符串处停止正则表达式并捕获子字符串?,ios,swift,regex,Ios,Swift,Regex,我想捕获正则表达式的两个匹配项之间的字符串 我有这根绳子 var testingString="NO Lettuce nNO Onions nNO Tomato nNO Ketchup NO Grilled Onions NO baked Sub Zapps" 我现在使用的正则表达式是: let matches = self.regexMatches(for: "([^\\snNO]+|[NO]\\S+([a-zA-Z0-9_\\w+])+\\S)", in: testingString)
var testingString="NO Lettuce nNO Onions nNO Tomato nNO Ketchup NO Grilled Onions NO baked Sub Zapps"
我现在使用的正则表达式是:
let matches = self.regexMatches(for: "([^\\snNO]+|[NO]\\S+([a-zA-Z0-9_\\w+])+\\S)", in: testingString)
我得到的输出是:
Lettuce
Onions
Tomato
Ketchup
Grilled
Onions
baked
sub
zapps
生菜
洋葱
西红柿
番茄酱
烤的
洋葱
烤
附属的
扎普斯
但我希望输出为:
Lettuce
Onions
Tomato
Ketchup
Grilled Onions
baked sub zapps
生菜
洋葱
西红柿
番茄酱
烤洋葱
烤面包
这是我正在使用的regexMatches函数:
func regexMatches(for regex: String, in text: String) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex)
let nsString = text as NSString
let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
var tempResults = results.map { result in
(1..<result.numberOfRanges - 1).map { result.rangeAt($0).location != NSNotFound
? nsString.substring(with: result.rangeAt($0))
: ""
}
}
return tempResults.flatMap{$0}
} catch let error {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
func regexMatches(对于regex:String,在text:String中)->[String]{
做{
让regex=尝试NSRegularExpression(模式:regex)
设nsString=文本为nsString
让results=regex.matches(in:text,range:NSRange(位置:0,长度:nsString.length))
var tempResults=results.map{result in
(1..我会做得简单得多。只需将nNO
或NO
替换为拆分字符,并在其上拆分。现在修剪空白,删除任何空拆分,就完成了
let s = "NO Lettuce nNO Onions nNO Tomato nNO Ketchup NO Grilled Onions NO baked Sub Zapps"
let pattern = "\\bn?NO\\b"
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let s2 = regex.stringByReplacingMatches(in: s, options: [], range: NSRange(location: 0, length: s.utf16.count), withTemplate: "|")
let arr = s2.split(separator: "|", omittingEmptySubsequences: true)
.map{$0.trimmingCharacters(in: .whitespaces)}
// ["Lettuce", "Onions", "Tomato", "Ketchup", "Grilled Onions", "baked Sub Zapps"]
我会做得简单得多。只需将nNO
或NO
替换为拆分字符,然后对其进行拆分。现在删除空白,删除任何空拆分,就完成了
let s = "NO Lettuce nNO Onions nNO Tomato nNO Ketchup NO Grilled Onions NO baked Sub Zapps"
let pattern = "\\bn?NO\\b"
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let s2 = regex.stringByReplacingMatches(in: s, options: [], range: NSRange(location: 0, length: s.utf16.count), withTemplate: "|")
let arr = s2.split(separator: "|", omittingEmptySubsequences: true)
.map{$0.trimmingCharacters(in: .whitespaces)}
// ["Lettuce", "Onions", "Tomato", "Ketchup", "Grilled Onions", "baked Sub Zapps"]
为什么有些值有“n”而有些没有?是否要匹配前面有NO
或nNO
的任何内容?大写字母是否重要?在我看来,您似乎对这项任务考虑太多了。为什么不搜索一个更简单的模式-NO
,可能前面有n
,然后替换为您需要的内容然后可以拆分字符串吗?然后修剪拆分的组件,就完成了。是的,大写和小写很重要。我是编程的初学者。你能帮我怎么做吗?为什么有些值有“n”而有些没有?你想匹配前面有否
或nNO
的任何内容吗?大写很重要吗?它很重要吗在我看来,你似乎对这项任务想得太多了。为什么不搜索一个简单得多的模式-NO
,前面可能有n
,然后替换为可以拆分字符串的模式?然后修剪拆分的组件,就完成了。是的,大写和小写都很重要。我是编程新手。你能e帮助我如何做?只使用let pattern=“(\\s*n?NO\\s*)”let replaced=testingString.replacingOccurrences(of:pattern,with:“\n”,options:.regularExpression)怎么样
?不需要使用引入的分隔符。事实上,要检查正则表达式可能会更费时。好吧,@Larme,当然你可以这样做,但你只是将拆分向后推了一步。OP迟早会想要拆分(他的打印输出只是一个工件),所以我们不妨先做一下。@Larme我在这里真正想做的是拆分。因此,作为一个给定条件,我试图解决的问题是Swiftsplit
不采用正则表达式模式,这与带有“real”的语言不同字符串处理,比如ruby。我的方法只是解决这个问题的一个方法。如果这是ruby,我会在没有引入任何分隔符的情况下进行拆分。如果我在没有之前有破折号呢?比如-没有烤洋葱-。我如何删除它?然后你问错了问题。我只能回答你实际提出的问题。提供正确的规范是你的问题。W关于仅使用let pattern=“(\\s*n?NO\\s*)”let replacement=testingString.replacingOccurrences(of:pattern,with:“\n”,options:.regularExpression)
?不需要使用引入的分隔符。事实上,要检查正则表达式可能会更费时。好吧,@Larme,当然你可以这样做,但你只是将拆分向后推了一步。OP迟早会想要拆分(他的打印输出只是一个工件),所以我们不妨先做一下。@Larme我在这里真正想做的是拆分。因此,作为一个给定条件,我试图解决的问题是Swiftsplit
不采用正则表达式模式,这与带有“real”的语言不同字符串处理,比如ruby。我的方法只是一个解决方法。如果这是ruby,我会在没有引入任何分隔符的情况下进行拆分。如果我在没有之前使用破折号呢?比如-没有烤洋葱-。我如何删除它?然后你问错了问题。我只能回答你实际提出的问题。提供正确的规范是你的问题。