如何验证有很多空格的文本?

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
}