如何验证有很多空格的文本?
How to validate text with lot of empty spaces?
描述:
我正在创建一个应用程序,您可以在其中更改个人资料的名称。问题是用户可以用很多空 space 来写他们的名字,我不知道如何避免这个问题。
示例:
(我打算用下划线“_”表示空space)
编辑您的姓名: T_____omas_Men________n____i_ti //// (31 个字符)
如果有人在编辑文本上写了这个,空的 space 将被保存,然后我们会在用户的个人资料中看到这个大名字。
我想要什么?
我需要一个代码来检查编辑文本何时连续有多个 (> 1) 个空 spaces 以便删除它们。代码应该可以检测到 "name" 在 "last name"
之后必须有一个空的 space
您可以通过巧妙的方式使用 TextWatcher 来限制 EditText。
以下代码的工作流程
- 创建 TextWatcher 并将其添加到 EditText。 onTextChanged函数里面的逻辑有没有
逻辑 1 : 避免空 space 作为第一个字符
逻辑 2 : 限制 EditText 只允许在一个字符后 space
逻辑 3 : 限制 EditText 只允许一个 space 用于整个字符串
逻辑 4 : 在 editText 中设置值之前移除文本更改列表器
逻辑 5 : 在 editText 中设置适当的值
逻辑 6 : 再次为 editText 添加文本更改列表器
试试下面的代码。
package com.example.application;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import com.example.myapplication.R;
public class SampleActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
editText = findViewById(R.id.editText);
editText.addTextChangedListener(textWatcher);
}
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String preValue = editText.getText().toString();
/*
* To avoid empty space as a first character
* */
if (preValue.length() > 0 && preValue.trim().isEmpty()) {
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
}
/*
* Restrict EditText to allow only one space after a character
* */
if (preValue.endsWith(" ")) {
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
}
/*
* Restrict EditText to allow only one space for entire string
* */
if (preValue.trim().contains(" ") && preValue.endsWith(" ")) {
/*
* Remove Text Change Lister before setting value in editText
* */
editText.removeTextChangedListener(textWatcher);
/*
* Set proper value in editText
* */
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
/*
* Again add Text Change Lister for editText
* */
editText.addTextChangedListener(textWatcher);
}
if (preValue.contains("---") && preValue.endsWith(" ")) {
String[] words = preValue.split(" ");
if (words.length >= 2) {
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
return;
}
StringBuilder stringBuilder = new StringBuilder();
for (String word : words) {
stringBuilder.append(word).append(" ");
}
/*
* Remove Text Change Lister before setting value in editText
* */
editText.removeTextChangedListener(textWatcher);
/*
* Set proper value in editText
* */
editText.setText(stringBuilder);
editText.setSelection(editText.getText().toString().length());
/*
* Again add Text Change Lister for editText
* */
editText.addTextChangedListener(textWatcher);
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
}
希望这能解决您的问题。
我提供了一种不同类型的解决方案,它专注于使用裸字符串而不是 EditText。请记住,此答案可与此处的其他答案结合使用。
private static String filterMultipleSpaces(String s) {
char[] result = new char[s.length()];
int iC = 0;
for (int iS = 0; iS < s.length(); ++iS) {
char currentChar = s.charAt(iS);
if (currentChar != ' ' || (iC > 0 && result[iC - 1] != ' ')) {
result[iC] = currentChar;
++iC;
}
}
return new String(result);
}
上述静态函数接受一个字符串并删除多个空格。理想情况下,您可以在文本更改 () 或提交 EditText 的值时使用它
按照此处所述使用 TextWatcher:Android: How can I validate EditText input?
然后在 onTextChanged(CharSequence s, int start, int before, int count) 方法中你可以验证用户输入,这里是例子:
if (s.contains(" ")) {
// ask user to edit input
// or change text programatically
String after = before.trim().replaceAll(" +", " ");
// set new text
}
描述:
我正在创建一个应用程序,您可以在其中更改个人资料的名称。问题是用户可以用很多空 space 来写他们的名字,我不知道如何避免这个问题。
示例:
(我打算用下划线“_”表示空space)
编辑您的姓名: T_____omas_Men________n____i_ti //// (31 个字符)
如果有人在编辑文本上写了这个,空的 space 将被保存,然后我们会在用户的个人资料中看到这个大名字。
我想要什么?
我需要一个代码来检查编辑文本何时连续有多个 (> 1) 个空 spaces 以便删除它们。代码应该可以检测到 "name" 在 "last name"
之后必须有一个空的 space您可以通过巧妙的方式使用 TextWatcher 来限制 EditText。
以下代码的工作流程
- 创建 TextWatcher 并将其添加到 EditText。 onTextChanged函数里面的逻辑有没有
逻辑 1 : 避免空 space 作为第一个字符
逻辑 2 : 限制 EditText 只允许在一个字符后 space
逻辑 3 : 限制 EditText 只允许一个 space 用于整个字符串
逻辑 4 : 在 editText 中设置值之前移除文本更改列表器
逻辑 5 : 在 editText 中设置适当的值
逻辑 6 : 再次为 editText 添加文本更改列表器
试试下面的代码。
package com.example.application;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import com.example.myapplication.R;
public class SampleActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
editText = findViewById(R.id.editText);
editText.addTextChangedListener(textWatcher);
}
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String preValue = editText.getText().toString();
/*
* To avoid empty space as a first character
* */
if (preValue.length() > 0 && preValue.trim().isEmpty()) {
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
}
/*
* Restrict EditText to allow only one space after a character
* */
if (preValue.endsWith(" ")) {
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
}
/*
* Restrict EditText to allow only one space for entire string
* */
if (preValue.trim().contains(" ") && preValue.endsWith(" ")) {
/*
* Remove Text Change Lister before setting value in editText
* */
editText.removeTextChangedListener(textWatcher);
/*
* Set proper value in editText
* */
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
/*
* Again add Text Change Lister for editText
* */
editText.addTextChangedListener(textWatcher);
}
if (preValue.contains("---") && preValue.endsWith(" ")) {
String[] words = preValue.split(" ");
if (words.length >= 2) {
editText.setText(preValue.substring(0, s.length() - 1));
editText.setSelection(editText.getText().toString().length());
return;
}
StringBuilder stringBuilder = new StringBuilder();
for (String word : words) {
stringBuilder.append(word).append(" ");
}
/*
* Remove Text Change Lister before setting value in editText
* */
editText.removeTextChangedListener(textWatcher);
/*
* Set proper value in editText
* */
editText.setText(stringBuilder);
editText.setSelection(editText.getText().toString().length());
/*
* Again add Text Change Lister for editText
* */
editText.addTextChangedListener(textWatcher);
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
}
希望这能解决您的问题。
我提供了一种不同类型的解决方案,它专注于使用裸字符串而不是 EditText。请记住,此答案可与此处的其他答案结合使用。
private static String filterMultipleSpaces(String s) {
char[] result = new char[s.length()];
int iC = 0;
for (int iS = 0; iS < s.length(); ++iS) {
char currentChar = s.charAt(iS);
if (currentChar != ' ' || (iC > 0 && result[iC - 1] != ' ')) {
result[iC] = currentChar;
++iC;
}
}
return new String(result);
}
上述静态函数接受一个字符串并删除多个空格。理想情况下,您可以在文本更改 (
按照此处所述使用 TextWatcher:Android: How can I validate EditText input?
然后在 onTextChanged(CharSequence s, int start, int before, int count) 方法中你可以验证用户输入,这里是例子:
if (s.contains(" ")) {
// ask user to edit input
// or change text programatically
String after = before.trim().replaceAll(" +", " ");
// set new text
}