我有一个字符串:
2+3-{Some value}
如何防止用户在运算符和操作数之间添加空格,但允许在花括号之间添加空格?也许是正则表达式?
更新
我正在研究实时验证公式。包括空格删除在内的所有验证均使用TextWatcher
完成。我的简化代码如下:
private val formulaWatcher: TextWatcher = object : TextWatcher {
override fun afterTextChanged(s: Editable?) = Unit
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
//Delay used here to avoid IndexOfBoundExceptions which arise because of a setSelection() method, it works with a little delay
Handler().postDelayed({
removeSpaces(s)
}, 100)
}
}
删除空格功能:
private fun removeSpaces(s: CharSequence) {
if (s.last().isWhitespace()) {
val textWithoutSpaces = s.replace(Regex("\\s"), "")
getText().clear()
append(textWithoutSpaces)
setSelection(textWithoutSpaces.length)
}
}
答案 0 :(得分:1)
UDATE
根据您提供的代码段,我修改了答案。 首先,使用trim()函数从输入字符串的开头和结尾删除空格。修剪字符串后,使用以下正则表达式达到所需的模式。
private fun removeSpaces(s: CharSequence) {
// e.g. s is " 2 + 3 - { some value } "
s = s.trim()
// now s is "2 + 3 - { some value }"
// define a regex matching a pattern of characters including some spaces before and after an operator (+,-,*,/)
val re = Regex("""\s*([\+\-\*\/])\s*""")
// $1 denotes the group in the regex containing only an operator
val textWithoutSpaces = re.replace(s, "$1")
// textWithoutSpaces is "2+3-{ some value }"
getText().clear()
append(textWithoutSpaces)
setSelection(textWithoutSpaces.length)
}
此正则表达式的工作方式是查找每个运算符,即+
,-
,*
和/
以及前后的空格。通过使用括号对运算符本身进行分组,包括多余空格在内的所有模式都将仅由不含任何多余空格的运算符替换。