如何修改正则表达式限制TextField仅含数字、单个逗号或句号?
解决TextField同时输入句号和逗号的问题
原代码的正则允许同时输入.和,,导致先输入.后还能输入,,不符合需求。我们需要修改正则,限制整个输入里只能出现.或者,中的一个,或者都不出现。
修改后的正则表达式
把原正则 ^[\\d]*(?:\\.?\\,?[\\d]*)?$ 替换为:
^\\d*(?:[.,]\\d*)?$
这个正则的含义:
^和$确保匹配整个输入字符串\\d*允许开头有任意数量的数字(包括0个)(?:[.,]\\d*)?是一个可选的非捕获组:[.,]匹配要么是.,要么是,,二选一\\d*允许符号后面跟任意数量的数字(包括0个)- 整个组加了
?,所以允许输入纯数字(没有符号)
修改后的完整代码
struct TextFieldNumbersOnly: View { @State private var inputValue = "" var body: some View { TextField("enter numbers", text: self.$inputValue) //.keyboardType(.decimalPad) //commented out for testing purposes only .onReceive(Just(self.inputValue), perform: self.textInputValidator) } func textInputValidator(newValue: String) { // 修改这里的正则表达式 if newValue.range(of: "^\\d*(?:[.,]\\d*)?$", options: .regularExpression) != nil { self.inputValue = newValue } else if !self.inputValue.isEmpty { self.inputValue = String(newValue.prefix(self.inputValue.count - 1)) } } }
验证效果
- 纯数字:
12345→ 允许 - 带句号:
123.45、.45、123.→ 允许 - 带逗号:
123,45、,45、123,→ 允许 - 同时带句号和逗号:
123.,45、. ,→ 不允许,输入后会被自动回退到上一个合法状态
内容的提问来源于stack exchange,提问作者fs_tigre
相关产品推荐
相关产品推荐

