使用正则表达式拆分以特定字符开头和结尾的组[重复]
Posted
技术标签:
【中文标题】使用正则表达式拆分以特定字符开头和结尾的组[重复]【英文标题】:Use regex to split groups starting and ending with specific character [duplicate] 【发布时间】:2018-06-16 17:09:58 【问题描述】:我得到一个这样的字符串...
var string = "A12345678B119292A88B2222A883849B123"
---> (var string =
"
A12345678
B119292
A88
B2222
A883849
B123
")
... 并且喜欢将字符串拆分为以 'A' 开头并以 'B' 结尾的特定组,以获得如下结果:
resultArray: "12345678", "88", "883849"
这是我目前发现的:
func matches(for regex: String, in text: String) -> [String]
do
let regex = try NSRegularExpression(pattern: regex)
let results = regex.matches(in: text,
range: NSRange(text.startIndex..., in: text))
return results.map
String(text[Range($0.range, in: text)!])
catch let error
print("invalid regex: \(error.localizedDescription)")
return []
let string = "A12345678B119292A88B2222A883849B123"
let pattern = "\\.*A.*B" // pattern error
let array = matches(for: pattern, in: string)
print(array)
[?]
如何使用 regex 和 Swift 实现这个结果?
【问题讨论】:
另外,如果对您有帮助,请考虑接受/投票(左侧的绿色勾号)答案to your other question。 【参考方案1】:您可以通过“积极的后视/前瞻”来实现这一目标 (比较Lookahead and Lookbehind Zero-Length Assertions):
let string = "A12345678B119292A88B2222A883849B123"
let pattern = "(?<=A).*?(?=B)"
let array = matches(for: pattern, in: string)
print(array)
// ["12345678", "88", "883849"]
模式匹配任意字符序列, 前面是“A”,后面是“B”。
还要注意使用
的“非贪婪”模式.*?
,否则你会得到
第一个“A”和最后一个“B”之间的单个匹配。
【讨论】:
诚然,这个问题措辞含糊。我只是从resultArray
中推断出需要数字,但在这里我可能错了。【参考方案2】:
除非你有其他例子,否则你可以使用
(?<=A)\d+(?=B)
见a demo on regex101.com。
请注意,您需要双转义反斜杠,因此您需要改写
(?<=A)\\d+(?=B)
。
【讨论】:
let pattern = "[AB]\d+"
会导致错误"Invalid escape sequence in literal"
这将匹配以 A 或 B 开头的任何数字序列。OP 只想匹配以 A 开头并以 B 结尾的数字。因此结果将是 ["12345678", "119292", "88", "2222", "883849", "123"]
而这不是 OP 所要求的
@LeoDabus:你说得对,已经更新了答案。以上是关于使用正则表达式拆分以特定字符开头和结尾的组[重复]的主要内容,如果未能解决你的问题,请参考以下文章
10 位或 6 位数字的正则表达式不应以“/”开头和结尾,也可以是字符串中的单个单词 [重复]
求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式