Вы можете использовать регулярное выражение с оператором множественного присваивания Groovy , чтобы упростить код.Рассмотрим следующий пример:
import java.util.regex.Pattern
try {
String U_id_str = "2100304213"
Pattern pattern = Pattern.compile(/^([0-9]{5})([0-9]{3})([0-9])([0-9])$/)
def (_, birthNum, pNum, gend, kNum) = (U_id_str =~ pattern)[0]
println "birthNum = ${birthNum}, pNum = ${pNum}, gend = ${gend}, kNum = ${kNum}"
} catch (IndexOutOfBoundsException ex) {
println "Input string does not match regular expression..."
}
В этом примере мы используем шаблон ^([0-9]{5})([0-9]{3})([0-9])([0-9])$
, который определяет 4 части исходного числа (представленного в виде строки).В 4-й строке мы проверяем, соответствует ли входная строка заданному шаблону, используя оператор =~
, который возвращает объект java.util.regex.Matcher
, и присваиваем каждую соответствующую часть переменным birthNum
, pNum
, gend
и kNum
.По соображениям безопасности мы выполняем этот код внутри блока try-catch, поскольку (U_id_str =~ pattern)[0]
может выдать IndexOutOfBoundsException
, если входная строка не соответствует заданному шаблону.
И последнее, но не менее важное: имейте в виду, что matcher возвращает совпадающие части в виде строк, поэтому, если вы хотите передать эти переменные в методы, которые ожидают, например, Integer
, вы должны явно привести их с помощью Integer.valueOf(...)
.
Вывод:
birthNum = 21003, pNum = 042, gend = 1, kNum = 3