正则表达式在android中不起作用

时间:2017-02-15 16:10:06

标签: java regex validation android-edittext

您好,我想逐个字符匹配,但这会产生错误,这是我的代码:

int length = input.length();
for (int i = 0; i < length; i++){
    char ch = input.charAt(i);
    String regex ="^[_\\s]||[آ-ی]$";
    Matcher matcher = Pattern.compile( regex ).matcher(ch);

这是我的完整代码:

public class MainActivity extends AppCompatActivity {
    EditText editText;
    Button button;
    String input;
    String result;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText)findViewById(R.id.edt);
        button = (Button)findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("ShowToast")
            @Override
            public void onClick(View v) {
               input = editText.getText().toString();
                check_reg();
            }
        });

    }
    public  boolean check_reg(){
        int length = input.length();
        for (int i = 0; i < length; i++){
            char ch = input.charAt(i);
            String regex ="^[_\\s]||[آ-ی]$";
            Matcher matcher = Pattern.compile( regex ).matcher(ch);
            if (matcher.find( ))
            {
                result = matcher.group();
                Toast.makeText(MainActivity.this, "match", Toast.LENGTH_SHORT).show();
            }
            else
            {
                Toast.makeText(MainActivity.this, "no match", Toast.LENGTH_SHORT).show();
            }

        }
        return false;
    }
}

这是我的问题的图像:

enter image description here

2 个答案:

答案 0 :(得分:1)

问题是您将char类型传递给<Pattern>.matcher()方法,该方法只接受StringCharSequence类型。 Here are the docs that explain it.

char ch = input.charAt(i);
String regex ="^[_\\s]||[آ-ی]$";
Matcher matcher = Pattern.compile( regex ).matcher(ch);

修复错误所需要做的就是在将char ch变量传递给matcher()方法时将其转换为字符串。

char ch = input.charAt(i);
String regex ="^[_\\s]||[آ-ی]$";
Matcher matcher = Pattern.compile(regex).matcher(Character.toString(ch));

答案 1 :(得分:1)

编译器告诉您必须将String传递给方法matcher()。您无法将char传递给它。

如果符合您的要求,您可以创建长度为1的字符串。

您可以以更自然的方式使用正则表达式,并让它为您进行匹配。例如:

public  boolean check_reg(){
    String regex ="^(?:[_\\s]||[آ-ی])+$";
    Matcher matcher = Pattern.compile( regex ).matcher(input);
    if (matcher.find( ))
        {
            result = matcher.group();
            Toast.makeText(MainActivity.this, "match", Toast.LENGTH_SHORT).show();
            return true;
        }
        else
        {
            Toast.makeText(MainActivity.this, "no match", Toast.LENGTH_SHORT).show();
            return false;
        }
}

此模式将逐个字符地匹配整个输入字符串。