首页 > 解决方案 > 如何为特定格式构建正则表达式,在版本中运行良好

问题描述

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

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;
    }
  }
}

标签: regexflutterdart

解决方案


利用

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

查看正则表达式演示

细节

  • ^- 字符串的开始
  • ([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}- 一到六位数
      • (-([0-9]{1,4}[A-Za-z]?)?)?- 可选的出现:
      • - - 一个连字符
      • ([0-9]{1,4}[A-Za-z]?)?- 可选出现 1 到 4 位数字,然后是可选的 ASCII 字母
  • $- 字符串结束。

推荐阅读