Swift - 正则表达式 - 提取由逗号分隔的括号中的数字(1,1)(2,3)

3
我需要从一个字符串中提取数字,例如“(1,1)(3,3)(4,4)”。我尝试使用“\d(,)\d)”进行提取,但逗号也被提取了。如何排除逗号并创建一个元组或数组的数组[[1,1],[3,3]...]?
let str = "(1,1) (2,2) (3,3)"
let pattern = "\\d(,)\\d"
let regex = try! NSRegularExpression(pattern:pattern)
let results = regex.matches(in: str, options: [], range: range)

如果您不想要逗号,为什么要捕获它呢? - Blindy
(4,4) 逗号也。 - John Aron
那么,仅使用\d+有什么问题呢? - MonkeyZeus
嗯...我使用 \d+ 获取每个数字。我需要将它们转换为 (n,n) 的元组。一种方法是遍历每个数字,然后形成元组。 - John Aron
请查看我的更新答案。该解决方案甚至支持一个数字“元组”。 - Wiktor Stribiżew
显示剩余2条评论
2个回答

2

一种可能的解决方案是仅捕获数字,用"[$1,$2]"替换每个出现的数字,然后在它们之间插入逗号,在方括号中包装表达式以获得JSON并进行解码。

let str =  "(1,1)(3,3)(4.4)"
let str1 = str.replacingOccurrences(of: "\\((\\d+)[.,](\\d+)\\)", with: "[$1,$2]", options: .regularExpression).replacingOccurrences(of: "][", with: "],[")
let result = try! JSONDecoder().decode([[Int]].self, from: Data(("[" + str1 + "]").utf8))

中间结果如下:
  • 第一步replacingOccurrences"[1,1][3,3][4,4]"
  • 第二步replacingOccurrences"[1,1],[3,3],[4,4]"
  • Data(...的参数为:"[[1,1],[3,3],[4,4]]"

这个程序运行良好,但如果你输入"(1,1)(3,3)(4,4) 4",比如一个单独的数字(举个例子)...它就会崩溃。 - John Aron
1
当然,这些信息并不是问题的一部分。我的方法仅适用于“提取括号内以逗号分隔的数字”。 - vadian

1

您可以使用

let s = "(1,1) (2,2) (3,3)"
print(s.replacingOccurrences(of: #"\)\s*\("#, with: "|",  options: .regularExpression)
  .trimmingCharacters(in: ["(", ")"])
  .components(separatedBy: "|")
  .map { $0.components(separatedBy: [",", "."]).map { Int($0)!} }
)

输出:[[1, 1], [2, 2], [3, 3]]
即使您在括号内只有一个数字,它也能正常工作。如果您有let s = "(1,1) (3,3)(4.4)(4)",输出将是[[1, 1], [3, 3], [4, 4], [4]]细节
  • \)\s*\( 匹配 ),0个或多个空白字符,(.replacingOccurrences(of: #"\)\s*\("#, with: "|", options: .regularExpression)| 替换所有匹配项
  • .trimmingCharacters(in: ["(", ")"]) 移除字符串开头和结尾的 ()
  • .components(separatedBy: "|") 使用 | 分割结果字符串
  • .map { $0.components(separatedBy: [",", "."]).map { Int($0)!} } 将每个元组拆分为组成数字,然后转换为 Int

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接