Cómo utilizar la expresión regular en android

Tengo un numberDecimal EditText que quiero validar usando la expresión regular. En validación lo que quiero es.

  1. Antes de punto decimal el dígito máximo que quiero entrar es tres y el dígito no debe comenzar con cero como 2,23,342 etc

  2. Después del punto decimal, el dígito máximo que quiero ingresar es uno como .1, .3, .6 etc.

Así que el número que permiten al usuario entrar es como 2.1, 32.5, 444.8, 564.9 etc

Pero en mi código lo que sucede es-

  1. Permite al usuario ingresar más de tres dígitos antes del punto decimal como 3456, 4444, 5555 y después de eso no me permite introducir el punto decimal después de eso.

  2. Me permite introducir 0 antes del punto decimal como el inicio del dígito.

Entonces, ¿por qué esto sucede, es algo malo en mi expresión regular que he utilizado. Si alguien sabe me ayuda a solucionar esto.

El código que he usado es

 weightEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count){ } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after){ } @Override public void afterTextChanged(Editable s) { Pattern mPattern = Pattern.compile("^([1-9][0-9]{0,2})?(\\.[0-9]?)?$"); Matcher matcher = mPattern.matcher(s.toString()); if(!matcher.find()) { weightEditText.setText(); // dont know what to place } } }); 

5 Solutions collect form web for “Cómo utilizar la expresión regular en android”

Nunca hay ningún punto al examinar dest solo en un InputFilter ; eso es lo que ya está presente en el campo. Cambie la concordancia de la expresión regular para que esté en contra de la source y sería apropiado si sólo quería comprobar que ciertos caracteres se aceptaron en el campo. Sin embargo, desea comprobar el formato del campo, no sólo filtrar la entrada en una base de carácter por carácter. Esto es mucho más complejo.

Cada vez que el usuario realiza un cambio en el contenido de tempEditText , el sistema llama al método de filtro de su filter antes de realizar el cambio. Pasa el contenido del campo actual y el cambio propuesto (que puede ser insert / append, delete o replace). El cambio está representado por una fuente fuente de CharSequence source (los caracteres -si es que CharSequence source se añaden al campo), los índices de inicio y fin de rango dentro de la fuente (el rango no es necesariamente todo de source ), un Spanned dest (el campo actual contenido antes del cambio) y los índices dstart y dend de rango dentro de dest que se propone reemplazar por el rango de source indicado.

El trabajo de filter es modificar el cambio (si es necesario) y devolver una CharSequence para usar (en su totalidad) en lugar de source (o null para seguir adelante y usar source ). En lugar de comprobar dest como lo está haciendo ahora, tendrá que comprobar si el cambio dará lugar a un campo aceptable. Para hacer esto, necesitará una lógica más compleja. (Tenga en cuenta, en particular, que el nuevo carácter (s) puede estar destinado a insertar en algún lugar que no sea al final, también, el filter se llamará cuando el usuario está borrando caracteres, así como agregarlos).

Puede ser más fácil implementar un TextWatcher . En su método beforeTextChanged , puede grabar el contenido actual y en su método afterTextChanged , puede comprobar (utilizando una expresión regular) si el contenido es aceptable y, si no, restaurar el contenido anterior al cambio. (Asegúrese de que el texto antes del cambio sea aceptable.Si no lo es, sustituya algo aceptable, como por ejemplo el borrado del campo, de lo contrario su código entrará en un bucle infinito porque el TextWatcher va a ser invocado de nuevo cuando usted corregir el contenido del campo.)

También tiene un error en su expresión regular: permite un cero inicial. Esta es una versión mejorada que corrige este problema (y elimina un conjunto de paréntesis innecesarios):

 "^([1-9][0-9]{0,2})?(\\.[0-9]?)?$" 

(Como aparte: puede usar \\d lugar de [0-9] .)

EDITAR

Aquí está mi edición de su edición:

 weightEditText.addTextChangedListener(new TextWatcher() { private static final Pattern sPattern = Pattern.compile("^([1-9][0-9]{0,2})?(\\.[0-9]?)?$"); private CharSequence mText; private boolean isValid(CharSequence s) { return sPattern.matcher(s).matches(); } @Override public void onTextChanged(CharSequence s, int start, int before, int count){ } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after){ mText = isValid(s) ? new CharSequence(s) : ""; } @Override public void afterTextChanged(Editable s) { if (!isValid(s)) { weightEditText.setText(mText); } mText = null; } }); 

Usted podría analizar el número y comprobar que es <1000 y que 10 * número es un entero, mientras que num es no. Probablemente sería más legible también.

Tal vez mi implementación ayudará a cualquiera:

  etRepeaterCallsign.addTextChangedListener(new TextWatcher() { private final Pattern sPattern = Pattern.compile("^([AZ]{0,2})?(\\d)?([AZ-]{0,5})"); // ^([1-9][0-9]{0,2})?(\\.[0-9]?)?$ private CharSequence mText; private boolean isValid(CharSequence s) { return sPattern.matcher(s).matches(); } @Override public void beforeTextChanged(CharSequence r, int start, int count, int after) { mText = r.toString(); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { bIsEdit = true; } @Override public void afterTextChanged(Editable s) { etRepeaterCallsign.removeTextChangedListener(this); int iCursorPosition = etRepeaterCallsign.getSelectionStart(); etRepeaterCallsign.setText(""); if (isValid(s)) etRepeaterCallsign.append(s); else etRepeaterCallsign.append(mText); etRepeaterCallsign.setSelection(iCursorPosition); etRepeaterCallsign.addTextChangedListener(this); } }); 

Usted podría intentar algo como esto: ^[1-9][0-9]{0,2}(\\.\\d)?$ . Esto debería coincidir con cualquier número que no comience con 0 ( ^[1-9] ) y es seguido por un máximo de dos números ( [0-9]{0,2} ). El regex también permite un valor decimal opcional ( (\\.\\d)?$ ).

Dicho esto, idealmente usted debe analizar el valor de la cadena a un double o float y hacer lo que nunca las validaciones que necesita para hacer utilizando el valor numérico real.

Para analizar su string en un valor double , tendrá que utilizar el Double.parseDouble (String s) como así: double myValue = Double.parseDouble(EditText.getText());

Intenté su patrón usando mi código como siguiendo. Funciona perfectamente como 2.1, 32.5, 444.8, 564.9 etc.

Mi código:

 public class WebPush extends Activity { EditText editTxt; private TextView regresult; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); editTxt = (EditText) findViewById(R.id.editID); regresult = (TextView) findViewById(R.id.txtID); String urName = editTxt.getText().toString(); editTxt.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) { } @Override public void afterTextChanged(Editable s) { if (editTxt.getText().toString().matches("(^([0-9]{0,3})?)(\\.[0-9]{0,1})?$")) { regresult.setText(""); } else { regresult.setText("invalid number"); } } }); } } 
  • Regex para eliminar espacios entre números solamente
  • Divide la cadena en la última aparición del carácter
  • RegEx para encontrar URL en HTML tarda 25 segundos en Java / Android
  • Referencia a grupos coincidentes anteriores dentro de un regex
  • ¿Qué hace (?! A) {0}? Significa en un regex de Java?
  • Editar texto aceptar sólo números no números decimales en android
  • Validar cadena con regex en android
  • Excluir etiquetas HTML y algunos caracteres UNICODE mientras busca en SQLite
  • Cómo ejecutar una consulta con regexp en Android
  • Cómo validar String usando expresión regular en java
  • ¿Hay una manera rápida de reconocer códigos HTML ASCII en una cadena o TextView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.