基于正则表达式从字符串中提取字符串数组? - 斯威夫特
Posted
技术标签:
【中文标题】基于正则表达式从字符串中提取字符串数组? - 斯威夫特【英文标题】:Extract string array from string based on regex? - Swift 【发布时间】:2022-01-12 16:33:08 【问题描述】:所以我想要达到的目标:
我有一个如下所示的输入字符串:
let inputString = "1*1 (10, 10) (5, 5)"
注意括号内第一个数字后面的空格。
为了分离这个输入,我使用:
inputString.components(separatedBy: " ")
返回以下数组:
0: 1*1
1 "(10,"
2 "10)"
3 "(5,"
4: "5)"
我想要的结果是:
0: "1*1"
1: "(10, 10)"
2: "(5, 5)"
问题是坐标中的 空格 导致字符串再次分离,而我不希望它这样做。
我还尝试使用以下方法将它们分开:
inputString.replacingOccurrences(of: " ", with: "").components(separatedBy: CharacterSet.init(charactersIn: "\"([)")).filter( $0 != "" )
但这会从字符串中删除 "(" 和 ")",我需要保留。
欢迎提出任何建议。谢谢
【问题讨论】:
见***.com/a/47985411/3832970。只需将else
替换为else finalArr.append("(\(value))")
【参考方案1】:
没有正则表达式
您可以使用(
和)
进行拆分,并在用括号将它们包裹起来的同时返回奇数块。您可以重复使用以下代码:
let inputString = "1*1 (10, 10) (5, 5)"
let newArr = inputString.components(separatedBy: ["(", ")"])
var finalArr = [String]()
for (index, value) in newArr.enumerated()
if (index + 1) % 2 == 1
finalArr.append(contentsOf: value.components(separatedBy: " ").filter $0 != "" )
else
finalArr.append("(\(value))")
print(finalArr)
// => ["1*1", "(10, 10)", "(5, 5)"]
使用正则表达式
您可以匹配一个或多个出现在括号内的任何子字符串或除空格和括号之外的任何字符:
import Foundation
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(at: 0), in: text)!])
catch let error
print("invalid regex: \(error.localizedDescription)")
return []
let originalString = "1*1 (10, 10) (5, 5)"
print(matches(for: #"(?:\([^()]*\)|[^()\s])+"#, in: originalString))
// => ["1*1", "(10, 10)", "(5, 5)"]
请参阅regex demo。 详情:
(?:
- 非捕获组的开始:
\(
- 一个 (
字符
[^()]*
- 除了 (
和 )
之外的零个或多个字符
\)
- 一个 )
字符
|
- 或
[^()\s]
- 除(
、)
和空格以外的任何字符
)+
- 组结束,出现一次或多次。
【讨论】:
匹配函数looks familiar :) @MartinR 很有可能,我保存了好的 sn-ps 并重新使用它们来展示正则表达式的工作。 @WiktorStribiżew 您认为哪种解决方案是实现我所寻找的最佳/最干净的解决方案?您发布的第一条评论或匹配功能?谢谢! @Liam 我没有进行基准测试,但我相信非正则表达式解决方案会更快。以上是关于基于正则表达式从字符串中提取字符串数组? - 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章