我正在用Java开发一个必须查找具有以下特征的字母数字单词的代码:
用于查找护照和其他身份证件。
我正在使用的当前正则表达式就是这个:
\s(?:[a-z]*[0-9]+)[a-z0-9\-\.]{2,}
必须找到的字母数字示例:
当前的RegEx仅找到前三个。我该如何解决这个问题?
答案 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")
}
}
}
说明:
^(?=(?:.*\d){3,})[a-z\d.-]+$
-字符串的开头^
-这种积极向上的眼光可确保文本中至少包含三位数字(?=(?:.*\d){3,})
-该字符集按照发布中的规则捕获一个或多个所有允许的字符集,即使用[a-z\d.-]+
的数字使用a-z
和点\d
的小写字母和连字符.
,并始终确保连字符应为字符集中的最后一个字符或第一个字符,否则可能会导致行为不正确-
-标记输入结束此外,与理论上应该更快的做法相反,您甚至可以尝试使用此正则表达式,
$
哪些应该执行得更快,但是实际的基准测试表明,我的第一个带有^(?=(?:\D*\d){3})[a-z\d.-]+$
的正则表达式实际上执行得更快。 [警告] ,因此,我建议使用我建议的第一个正则表达式而不是这个。
.*\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+次列出的内容(包括数字)$
声明字符串的结尾另一种选择是基于对比度使用负前瞻,以防止不必要的回溯,而不是先匹配一个数字,然后再匹配一个数字,并重复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次以上字符类中列出的内容$
字符串结尾