正则表达式,用于匹配身份证明文件中的字母数字字符串

时间:2019-05-01 13:51:29

标签: java regex

我正在用Java开发一个必须查找具有以下特征的字母数字单词的代码:

  • 至少3个数字。
  • 零个或多个字母(小写)。
  • 零个或多个字符“-”(连字符)。
  • 零个或多个字符“。” (点)。
  • 没有其他特殊字符。

用于查找护照和其他身份证件。

我正在使用的当前正则表达式就是这个:

\s(?:[a-z]*[0-9]+)[a-z0-9\-\.]{2,}

必须找到的字母数字示例:

  • 123456789r
  • 1234567
  • 12.3456.789-r
  • x-1234567-y

当前的RegEx仅找到前三个。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式,

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService,
                    error: Error?) {
        guard let characteristics = service.characteristics else { return }

        for characteristic in characteristics {
            print(characteristic)
            if characteristic.properties.contains(.read) {
                print("\(characteristic.uuid): properties contains .read")

                peripheral.readValue(for: characteristic)
            }
            if characteristic.properties.contains(.notify) {
                print("\(characteristic.uuid): properties contains .notify")

            }
        }
    }

Regex Demo 1

说明:

  • ^(?=(?:.*\d){3,})[a-z\d.-]+$ -字符串的开头
  • ^-这种积极向上的眼光可确保文本中至少包含三位数字
  • (?=(?:.*\d){3,})-该字符集按照发布中的规则捕获一个或多个所有允许的字符集,即使用[a-z\d.-]+的数字使用a-z和点\d的小写字母和连字符.,并始终确保连字符应为字符集中的最后一个字符或第一个字符,否则可能会导致行为不正确
  • --标记输入结束

此外,与理论上应该更快的做法相反,您甚至可以尝试使用此正则表达式,

$

哪些应该执行得更快,但是实际的基准测试表明,我的第一个带有^(?=(?:\D*\d){3})[a-z\d.-]+$ 的正则表达式实际上执行得更快。 [警告] ,因此,我建议使用我建议的第一个正则表达式而不是这个。

Regex Demo 2

Java code demo

.*\d

打印

List<String> list = Arrays.asList("123456789r","1234567","12.3456.789-r","x-1234567-y","D123F", "ab12.d");
list.forEach(x -> {
    System.out.println(x + " --> " + x.matches("^(?=(?:.*\\d){3,})[a-z\\d.-]+$"));
});

答案 1 :(得分:1)

如果唯一的要求是至少包含3位数字,而其余部分是可选的,则可以使用:

^(?:[a-zA-Z0-9.-]*[0-9]){3}[a-zA-Z0-9.-]*$

说明

  • ^字符串的开头
  • (?:[a-zA-Z0-9.-]*[0-9]){3}重复字符类中列出的3次,不带数字,然后匹配数字0-9
  • [a-zA-Z0-9.-]*匹配0+次列出的内容(包括数字)
  • $声明字符串的结尾

Regex demo

另一种选择是基于对比度使用负前瞻,以防止不必要的回溯,而不是先匹配一个数字,然后再匹配一个数字,并重复3次。

请注意,在您的角色类中,您不必转义点,并且如果将连字符移动到开始或结尾,您也不必转义。

^(?=(?:[^\d\n]*\d){3})[a-zA-Z\d.-]+$

在Java中:

String regex = "^(?=(?:[^\\d\\n]*\\d){3})[a-zA-Z\\d.-]+$";

说明

  • ^字符串的开头
  • (?=正向前进,断言右边是
    • (?:[^\d\n]*\d){3}重复3次,不匹配数字或换行符,然后匹配数字
  • )积极回望
  • [a-z\d.-]+重复1次以上字符类中列出的内容
  • $字符串结尾

Regex demo

相关问题