Swift 如何将部分文本转换为活动元素?
apple notes中有一项功能,在用户完成输入[参见图片]后,突出显示文本中的日期,并允许在日历中指定活动。 Whatsapp messenger中也有相同的功能 这个的伪代码是什么 这项功能是如何实现的?我想做一些类似的事情,但我想从课文中选择主题,并对它们采取行动。例如,如果文本是关于动物的,则应突出显示所有动物,并且可以对该元素执行操作 我想它可能是用Swift 如何将部分文本转换为活动元素?,swift,regex,swiftui,nlp,Swift,Regex,Swiftui,Nlp,apple notes中有一项功能,在用户完成输入[参见图片]后,突出显示文本中的日期,并允许在日历中指定活动。 Whatsapp messenger中也有相同的功能 这个的伪代码是什么 这项功能是如何实现的?我想做一些类似的事情,但我想从课文中选择主题,并对它们采取行动。例如,如果文本是关于动物的,则应突出显示所有动物,并且可以对该元素执行操作 我想它可能是用Regex模式或str.contains(“…”) 问题是当我找到这个词时该怎么办?将字符串分为3部分,以便中间部分以某种方式转换为带
Regex模式
或str.contains(“…”)
问题是当我找到这个词时该怎么办?将字符串分为3部分,以便中间部分以某种方式转换为带下划线标签的按钮?在切片之后,如何将其混合在一起,以及如何执行切片本身
var str = "Let's go tomorrow at 18:00 to walk with my monkey.
We can also go to the coffeeshop."
let animals = ["chicken", "crocodile", "cow", "bear", "goose", "monkey", "dog"]
for animal in animals {
if str.contains(animal) {
print(animal)
// transform that part of the text into button with underlined label
}
}
下面是一个应用于实际接口的示例
//注意!如果我在TextEditor中编写“让我们明天18:00见面”,Text()视图中的日期将不会突出显示
struct ContentView: View {
@State private var str = "This is some editable text..."
@State private var tapped = 0
var body: some View {
VStack {
HStack {
Text(str)
.padding(40)
Spacer()
}
TextEditor(text: $str)
.padding(40)
.border(Color(UIColor.separator))
.onTapGesture {
tapped += 1
if tapped == 1 {
str = ""
}
}
}
}
}
这里是Regex
方法,因为我猜这是对日期所做的。它还没有准备好(非常粗糙),但只是方向
func stringDeduction(of inputText: String) {
// some regex pattern here
let pattern = "at [0-9]{1,}"
let regexOptions: NSRegularExpression.Options = [.caseInsensitive]
let matchingOptions: NSRegularExpression.MatchingOptions = [.reportCompletion]
// TODO - catch errors with regex
let regex = try! NSRegularExpression(pattern: pattern, options: regexOptions)
let range = NSRange(location: 0, length: inputText.utf8.count)
if regex.firstMatch(in: inputText, range: NSRange(location: 0, length: inputText.utf8.count)) != nil {
print("*: Match!")
} else {
print("*: No match.")
}
func matches(for regex: String, in text: String) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex)
let results = regex.matches(in: text, options: [], range: NSRange(text.startIndex..., in: text))
return results.map {
String(text[Range($0.range, in: text)!])
}
} catch {
print("invalid regex")
return []
}
}
}
如果没有他们的源代码,我不知道Apple或Whatsapp是如何做到这一点的——但通过您的简单示例文本,可以使用正则表达式轻松实现:
(?:\w+\s+at\s+)?\d{1,2}:\d{2}
Regex101演示:
如果您发现更多需要更多信息的示例,请在此处发表评论,我将查看是否可以更新。嗨,史蒂夫!谢谢也许你知道最初的字符串是如何被切掉的?当在文本中找到单词时,也应该找到它们的位置;将字符串切片,并将每个部分分配给一个新变量(总共3个)
开头
foundPhrase
剩余句子
。当我找到这个词时,我不知道如何找到位置。以及如何制作切片。我以前没有使用Swift,但建议的正则表达式捕获了整个文本(而不是说有单独的组),因此通过的range
属性,它应该足够简单。(如果没有,请再次发布,我将尝试对其进行编码)。