如何为特定格式构建正则表达式,在版本中效果很好

时间:2019-11-11 21:51:39

标签: regex flutter dart

我必须为此格式做一个正则表达式。

002-251285-0008P

前三位数字是区域代码,可以是任意数字,但只能是3位数字。之后,只有在我可以添加“-”之后。 然后,六位数字是两位数字的日期,分别是25天,12月和85年(最后两位数字)  1985年)之后,我可以添加“-”。 最后一组是由4个数字和一个字母组成的另一个代码。

我想检查文本字段是否正在编辑。但总是有东西出现。 我将进行一些尝试,但是类似“我可以在开头添加'-'”或“直到我具有完整的格式才匹配,这样文本字段才不会被写入”的问题。

^\$|^([0-9]{0,3})(\\-)?([0-9]{0,6})\$

^\$|^([0-9]{3})(\\-[0-9]{0,6})\$

他们不是完整的,他们只是第一个分组的人,或者是他们严格,不允许我输入数字,而是他们变软并允许我在开头输入“-”。

我们非常感谢您的帮助。

修改

这是我使用正则表达式的方式

在这里我声明所有正则表达式字符串:

class Regex{
  String regexNumerocondosdecimales = "^\$|^(0|([1-9][0-9]{0,3}))(\\.[0-9]{0,2})?\$";
  String regexSoloLetrasyEpacios = "[a-zA-Z \s]{0,30}";
  String regexSoloNumeros = "^\$|^(0|([1-9][0-9]{0,1}))\$";
  String regexCedula = "r'^\d{1,3}(?:-(?:\d{1,6}(?:-(?:\d{1,4}P?)?)?)?)?\$'";
  String regexLetrasyNumeros = "[a-zA-Z0-9 \s]{0,200}";
  String regexCelular = "^[578] [0-9]{0,7}\$";
}

我在这里设置并验证

abstract class ValidadorString{
  bool esValido(String value);
}

class ValidadorRegex implements ValidadorString{
  final String fuenteRegex;
  ValidadorRegex({this.fuenteRegex});

  bool esValido(String value){
    try{
      final regex = RegExp(fuenteRegex);
      final matches = regex.allMatches(value);
      for(Match match in matches){
        if (match.start == 0 && match.end == value.length) {
          return true;
        }
      }
      return false;
    } catch (e){
      assert(false, e.toString());
      return true;
    }
  }
}

1 个答案:

答案 0 :(得分:1)

使用

String regexCedula = '^([0-9]{1,3}(-([0-9]{1,6}(-([0-9]{1,4}[A-Za-z]?)?)?)?)?)?$';

请参见regex demo

详细信息

  • ^-字符串的开头
  • ([0-9]{1,3}(-([0-9]{1,6}(-([0-9]{1,4}[A-Za-z]?)?)?)?)?)?-的可选序列
    • [0-9]{1,3}-1、2或3位数字
    • (-([0-9]{1,6}(-([0-9]{1,4}[A-Za-z]?)?)?)?)?-可选出现:
    • --连字符
    • ([0-9]{1,6}(-([0-9]{1,4}[A-Za-z]?)?)?)?-可选出现:
      • [0-9]{1,6}-1-6位数字
      • (-([0-9]{1,4}[A-Za-z]?)?)?-可选出现:
      • --连字符
      • ([0-9]{1,4}[A-Za-z]?)?-可选的1到4位数字,然后是可选的ASCII字母
  • $-字符串的结尾。