Мне нужны определенные ограничения в моем проекте, особенно в регулярном выражении, чтобы ограничить ввод пользователя и отформатировать его соответствующим образом. Эти правила предназначены для реализации в компоненте TextField моего проекта Jetpack Compose.
Правила:
Примеры: (Эти примеры приведены только в справочных целях.)
Я попробовал код Belwo, но он не работает должным образом.
var text by remember { mutableStateOf("") }
val regex = remember { Regex("^(?!0|\\.)(?!.*\\.\\.)\\d{1,4}(\\.\\d{1,2})?$") }
TextField(
label = R.string.label_days,
value = text,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number
),
onValueChange = { days ->
if (days.isEmpty() || regex.matches(days)){
text = days
}
})
Если вы не разрешите конечную точку, ее будет сложно ввести, даже если пользователь впоследствии намеревается добавить дополнительные цифры. Это у тебя проблема?
Хорошо, разрешите конечную точку. Вы всегда можете удалить его впоследствии при обработке значения. Однако это необходимо разрешить в TextField. Чтобы разрешить точку, используйте это регулярное выражение "^[1-9]\\d{0,3}(\\.\\d{0,2})?$"
@Leviathan Пробовал это, но после применения этого даже не набрал ни одного текста в текстовом поле.
Вам удалось избежать всех трех обратных косых черт?
@Leviathan Да, я сделал это
Что ж, ваш точный код с заменой регулярного выражения тем, которое я предоставил, у меня работает отлично, я не могу воспроизвести описанную вами проблему.





Ниже код будет работать для вашего требования
var text by remember { mutableStateOf("") }
val regex = remember { Regex("^(?!0)(?!.*\\.\\..*|\\.$)\\d{0,4}(\\.\\d{0,2})?\$") }
TextField(
label = {
Text(text = "Days")
},
value = text,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number
),
onValueChange = { days ->
if (days.isEmpty() || days.matches(regex)) {
text = days
}
}
)
Привет, как создать регулярное выражение, где я могу научиться? Также можете ли вы предоставить другое регулярное выражение, где десятичное число не переписывается, требуется только 4-значное число, начинающееся не с нуля
Здесь у вас есть 2 варианта:
TextFieldValueTextField, чтобы предотвратить перемещение курсора при недопустимом вводе.С шаблоном регулярного выражения @Leviathan это будет выглядеть так:
Опция 1:
val regex = remember { Regex("^[1-9]\\d{0,3}(\\.\\d{0,2})?$") }
var text by rememberSaveable(stateSaver = TextFieldValue.Saver) {
mutableStateOf(TextFieldValue(""))
}
Row {
TextField(
// label = R.string.label_days,
label = { Text("Days") },
value = text,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number
),
onValueChange = { days: TextFieldValue ->
if (days.text.isEmpty() || regex.matches(days.text)) {
text = days
}
}
)
Button(
onClick = {},
) {
Text("Always OK")
}
}
Вариант 2:
val regex = remember { Regex("^[1-9]\\d{0,3}(\\.\\d{1,2})?$") }
var text by remember { mutableStateOf("") }
var isValid by remember { mutableStateOf(true) }
Row {
TextField(
// label = R.string.label_days,
label = { Text("Days") },
value = text,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number
),
supportingText = {
if (!isValid) {
Text("Invalid input")
}
},
isError = !isValid,
onValueChange = { days: String ->
isValid = (days.isEmpty() || regex.matches(days))
text = days
}
)
Button(
onClick = {},
enabled = isValid,
) {
Text("OK")
}
}
Действительно оцените свои усилия здесь. Ваш ответ работает для меня. Но я хочу, чтобы все было просто, и ответ, предоставленный РавиШармой, сработал. Так что просто любопытно узнать, что-то не так с ответом РавиШармы, потому что с его ответом я добился того же поведения, что и ваш вопрос.
Ничего особенного: использование TextFieldValue предотвратит перемещение курсора, если регулярное выражение не соответствует. В версии String попробуйте ввести полное число с точкой, например «1234,56», затем поместите курсор в начало и введите что-нибудь. Курсор будет перемещаться без изменения текста. @ CODAR747
Как следует обрабатывать конечную точку?