如何将多个分隔符传递给子字符串 (Kotlin/Android)?

How to pass multiple delimiters to a substring (Kotlin/Android)?

我正在尝试制作一个计算器应用程序,我需要能够在有人第二次按下运算符 (+,*,-,/) 后获得最后一个值(第一个值被保存没有问题,因为它是屏幕上唯一的数字)。 所以如果屏幕顶部有类似 (222 * 3333 / 12) 的东西,我需要得到 12。一旦我学会了如何做,我就能弄清楚如何保存之前的 number/sum,然后进行计算在下一个数字上(虽然我还没有制作那部分)。 我知道这是一种简陋的做事方式,欢迎提出任何建议。 因此,如果我使用 substringAfterLast() 并在那里插入一个运算符,我可以获取这个数字,但是,如果混合使用多个运算符(如 222 * 3333 / 12),我的 y 变量(见下文)只显示“222 * 3333 / 12" 而不是 12。 如何为子字符串使用多个定界符?

顺便说一下我的代码(见谅)

        multiplybutton.setOnClickListener {
            var x = numbersEntered.toString()
            var y = ""
            //creates an array that holds the operators so it can be easily filtered out
            val operators = arrayOf<Char>('*','/','+','-')
            //prevents app from crashing by saving the last value before the operator is added, allowing us to create infinite number of operations
            if (x.any(operators :: contains)){
//                x.split(operators.toString())
                
                y = x.substringAfterLast('*')  // can't use my operator character array here? why? how do I iterate through it?
                Toast.makeText(this, y.toString(), Toast.LENGTH_SHORT).show()

//                previousvalue = y.toInt()
            } else {
                previousvalue = x.toInt()
            }
            numbersEntered.append("*")
            numbersEnteredBox.setText(numbersEntered.toString())
            isMultiply = true;
            Toast.makeText(this, previousvalue.toString(), Toast.LENGTH_SHORT).show()
        }

编辑:请忽略斜体,不知道哪里出了问题

抱歉,也许我不完全明白你想做什么,但你可以使用 split 函数从字符串中获取最后一个数字,如下所示 222 * 3333 / 12:

println("222 * 3333 / 12".split('+', '-', '*', '/').last().trim().toInt())
// prints 12

split与正则表达式一起使用

使用正则表达式可以很好地控制字符串的拆分方式。在您的情况下,任何不是数字的东西都可能是定界符。正则表达式有一个 built-in 字符 class,用 \D 表示,它将匹配任何不是数字的字符。

val pattern = Regex("""\D+""") // matches one or more non-digit characters
"1 * 2 / 3".split(pattern).last() // returns "3"

同样,您可以使用 [] 创建自己的字符 class,以更具体地说明您希望将哪些字符用作分隔符:

val pattern = Regex("""\s*[-\+*]\s*""") // matches -\+*, and any spaces around them
"1 * 2 / 3".split(pattern).last() // returns "3"