【发布时间】:2023-03-23 11:34:01
【问题描述】:
我目前正在实施NSRegularExpressions 来检查我项目中UITextView 字符串中的模式。
模式检查和操作按预期工作;例如:我正在尝试查找常规的 **bold** 降价模式,如果找到它,我会应用一些归因于该范围的文本,并且它可以按预期工作。
我遇到了一个问题。我不知道如何一次运行多个模式并为找到的每个模式应用不同的操作。
在我的UITextView 代表textViewDidChange 或shouldChangeTextIn range: NSRange 中,我正在运行粗体模式检查\\*{2}([\\w ]+)\\*{2},但随后我也在运行斜体模式检查\\_{1}([\\w ]+)\\_{1},再次循环通过UITextView text。
我已经实现了以下自定义函数,它将传入的regex 应用于字符串,但我必须多次调用此函数来检查每个模式,这就是为什么我喜欢将模式检查放入一个,然后“解析”每个match。
fileprivate func regularExpression(regex: NSRegularExpression, type: TypeAttributes) {
let str = inputTextView.attributedText.string
let results = regex.matches(in: str, range: NSRange(str.startIndex..., in: str))
_ = results.map { self.applyAttributes(range: $0.range, type: type) }
}
谢谢。
编辑
我可以将这两种模式与| 操作数“合并”,如下所示:
private let combinedPattern = "\\*{2}([\\w ]+)\\*{2}|\\_{1}([\\w ]+)\\_{1}"
但我的问题是要知道找到哪个模式是 \\*{2}([\\w ]+)\\*{2} 或 \\_{1}([\\w ]+)\\_{1}
【问题讨论】:
-
您将在您搜索的同一范围或其他部分应用这两种模式
-
相同范围,全文。我可以用
|操作数“合并”两个模式,但我不知道在迭代.matches时哪个匹配是什么 -
不相关,但调用
map然后丢弃结果是没有意义的。如果您只是想遍历一个集合并对其所有值应用闭包而不返回任何内容,请使用forEach而不是map。 -
@DávidPásztor 你是对的,我已经根据 Martin R. 之前的回答实现了这个,无论如何我会在解决这个问题时修复它:)
-
老实说,我不确定您是否想将其组合成一个表达式。我担心你想同时匹配两者,即使它们重叠但
|只会匹配其中一个。此外,您可能应该在模式中包含所有空格字符\s,而不仅仅是单个空格。另外,我很确定_包含在\w中,因此您应该特别排除它[\\w\\s^_]。
标签: ios swift nsregularexpression