【问题标题】:Java regex for max length with one hyphen带有一个连字符的最大长度的 Java 正则表达式
【发布时间】:2016-04-25 11:59:25
【问题描述】:

我需要根据给定条件验证输入,

- 总长度必须为 20 个字符 -前五个位置必须是字母 -remaining 应该是数字,但必须存在一个连字符(-),它应该只出现在数字之间。 我有这样的正则表达式

([a-zA-Z]){5}[0-9]+([-]){15} 

但它也允许在末尾使用连字符,甚至可以不使用连字符。

【问题讨论】:

  • 那你为什么不在里面加一个连字符呢?
  • 我认为在这里尝试非正则表达式解决方案更简单。
  • 是的,我确实在里面放了连字符,但效果是一样的。我刚刚添加了上面的,因为那是我最后一次测试。

标签: java regex


【解决方案1】:

你可以使用

^[a-zA-Z]{5}(?=[0-9-]{15}$)[0-9]+-[0-9]+$

请参阅regex demo

详情

  • ^ - 匹配字符串的开头
  • [a-zA-Z]{5} - 匹配 5 个字母
  • (?=[0-9-]{15}$) - 要求字符串的其余部分应为 15 个字符长
  • [0-9]+-[0-9]+ - 1+ 位数字后跟连字符,再跟 1+ 位数字
  • $ - 字符串结尾(您可以替换为\z 以排除字符串末尾最后一个换行符之前的匹配)

如果你使用.matches(),你可以省略外锚。

Java test

String pat = "[a-zA-Z]{5}(?=[0-9-]{15}$)[0-9]+-[0-9]+"; 
System.out.println("abcde123456-89012345".matches(pat));   // true
System.out.println("abcde-12345689012345".matches(pat));   // false
System.out.println("abcde12345689012345-".matches(pat));   // false
System.out.println("abcde12345689012345-12".matches(pat)); // false

【讨论】:

    【解决方案2】:

    只是在这里添加非正则表达式透视:

    if (str.length() != 20) {
      return false;
    }
    for (int i = 0; i < 5; ++i) {
      if (!Character.isAlphabetic(str.charAt(i)) {
        return false;
      }
    }
    boolean hyphenFound = false;
    for (int i = 5; i < 20; ++i) {
      char ch = str.charAt(i);
      if (ch == '-') {
        hyphenFound = true;
      } else if (!Character.isDigit(ch) && !Character.isAlphabetic(ch)) {
        return false;
      }
    }
    return hyphenFound;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多