Java 使用正则表达式查找文本中至少包含一个数字和一个字母的序列以及一些其他条件
我有以下正则表达式:Java 使用正则表达式查找文本中至少包含一个数字和一个字母的序列以及一些其他条件,java,regex,Java,Regex,我有以下正则表达式:([a-zA-Z0-9?]{4,8})([a-zA-Z0-9?]{4,8})+-([a-zA-Z0-9?]{4,8})) 如何避免不包含至少一个数字和一个字符(a-zA-Z)的匹配序列 例如: 本文: Hello World 123 abc 1AB2C-D3FGH-456I7-JK8LM-NOP9Q Hello World 123 abc 应返回1AB2C-D3FGH-456I7-JK8LM-NOP9Q 这是: 你好世界123 abc 11111-1111-1111你好世界1
([a-zA-Z0-9?]{4,8})([a-zA-Z0-9?]{4,8})+-([a-zA-Z0-9?]{4,8}))
如何避免不包含至少一个数字和一个字符(a-zA-Z)的匹配序列
例如:
本文:
Hello World 123 abc 1AB2C-D3FGH-456I7-JK8LM-NOP9Q Hello World 123 abc
应返回1AB2C-D3FGH-456I7-JK8LM-NOP9Q
这是:
你好世界123 abc 11111-1111-1111你好世界123 abc
或
你好世界123 abc aaaa aaaa aaaa aaa aaa你好世界123 abc
应该什么也不归还
我用Java开发,团队成员如下:
public List<String> getKeys() {
keys = new ArrayList<>();
Matcher matcher = KEY_REGEX.matcher(text);
while (matcher.find()) {
keys.add(matcher.group());
}
return keys;
}
public List getKeys(){
keys=newarraylist();
Matcher Matcher=KEY_REGEX.Matcher(文本);
while(matcher.find()){
添加(matcher.group());
}
返回键;
}
谢谢 一种方法是使用正向前瞻
(?=
检查是否至少出现a-Z和数字0-9
要匹配前瞻中的-
中的匹配项以查找两者,可以将其添加到角色类中
匹配时,开始匹配字符A-Z0-9,并在-
前面重复一组字符,以便-
不会连续出现,也不会出现在开头或结尾
\b(?=[A-Z0-9-]*[A-Z])(?=[A-Z0-9-]*[0-9])[A-Z0-9]+(?:-[A-Z0-9]+)+\b
单词边界\b
断言字符A-Z(?=[A-Z0-9-]*[A-Z])
断言数字0-9(?=[A-Z0-9-]*[0-9])
匹配A-Z0-9的1+个实例[A-Z0-9]+
重复将A-Z0-9的1+次匹配到前面的(?:-[A-Z0-9]+)+
-
单词边界\b
[A-z]
比[A-Za-z]
将字符类限制为4-8次出现:
\b(?=[A-Z0-9-]*[A-Z])(?=[A-Z0-9-]*[0-9])[A-Z0-9]{4,8}(?:-[A-Z0-9]{4,8})+\b
仅供参考。
[A-z]
匹配的不仅仅是字母。看看A。如果序列的每个部分都包含一个数字和一个字符A-z?或者整个序列至少有一次?A1111-1111-1111是否有效?在最后一种情况下,请尝试\b(?=[A-Z0-9-]*[A-z])(?=[A-Z0-9-]*[A-Z0-9])[A-Z0-9]+(?:-[A-Z0-9])+\b
整个序列至少应包含一个数字和一个字母。因此,您的示例将/应该是有效的。@Toto thank's的提示应该使用[a-zA-Z]。这非常有效!不知道边界。只有两个问题:为什么我需要*[a-Z](数字相同)在正向查找中,为什么我需要非捕获组?@chr3在正向查找中,[A-Z0-9-]*
用于匹配字符类中的所有指定字符,直到到达[A-Z]
或[0-9]
。*
表示0次或更多次。非捕获组是将部分作为一个整体重复(?:-[a-Z0-9]{4,8})+
太棒了,我收到了谢谢:)!在我的测试中,正则表达式在没有非捕获组的情况下也可以工作。@Chr3is欢迎您。分组用于不获取匹配项,如A1111---1111---1111