Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何将部分文本转换为活动元素?_Swift_Regex_Swiftui_Nlp - Fatal编程技术网

Swift 如何将部分文本转换为活动元素?

Swift 如何将部分文本转换为活动元素?,swift,regex,swiftui,nlp,Swift,Regex,Swiftui,Nlp,apple notes中有一项功能,在用户完成输入[参见图片]后,突出显示文本中的日期,并允许在日历中指定活动。 Whatsapp messenger中也有相同的功能 这个的伪代码是什么 这项功能是如何实现的?我想做一些类似的事情,但我想从课文中选择主题,并对它们采取行动。例如,如果文本是关于动物的,则应突出显示所有动物,并且可以对该元素执行操作 我想它可能是用Regex模式或str.contains(“…”) 问题是当我找到这个词时该怎么办?将字符串分为3部分,以便中间部分以某种方式转换为带

apple notes中有一项功能,在用户完成输入[参见图片]后,突出显示文本中的日期,并允许在日历中指定活动。 Whatsapp messenger中也有相同的功能

这个的伪代码是什么

这项功能是如何实现的?我想做一些类似的事情,但我想从课文中选择主题,并对它们采取行动。例如,如果文本是关于动物的,则应突出显示所有动物,并且可以对该元素执行操作

我想它可能是用
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
属性,它应该足够简单。(如果没有,请再次发布,我将尝试对其进行编码)。