我需要匹配ABCD12345
形式的字符序列和ABCD54321.aaa
形式的其他字符序列。
我已编写代码来检查两种表单,但它只对输入序列ABCD12345
正常工作,因为ABCD54321.aaa
由两个RegEx(ABCD54321.aaa
的一个和ABCD54321
的一个匹配) ABCD54321.aaa
)。
如何修改我的正则表达式,以便在输入为String[] patternValues = new String[] { "[Aa.][Bb][Cc][Dd]\\d+\\.+[a-zA-Z]{3}","[Aa.][Bb][Cc][Dd]\\d+"} ;
for(int i = 0 ; i <= (patternValues.length - 1) ; i++) {
Pattern regexp = Pattern.compile(patternValues[i]);
.....
}
时只有其中一个匹配?
以下是我的java代码片段,其中显示了我用来匹配字符序列的模式:
{{1}}
答案 0 :(得分:1)
假设您正在使用Java,并且您通过aMatcher.matches()
按顺序检查了2个不同的RegEx,则可以向RegEx添加负向预测,以便匹配“ABCD12345”仅 (而不是“ABCD54321.aaa”),即"[A-Z]{4}[0-9]{5}(?!\\.[a-z]{3})"
。 "(?!\\.[a-z]{3})"
是否定前瞻。
第二种方法是只保留一个RegEx(与两者匹配的RegEx),检索匹配的文本(通过aMatcher.group()
)并从aMatcher.group().length()
(应该是9或13)决定。
如果您更喜欢使用aString.matches(aRegEx)
,那么唯一的选择就是第一个。
答案 1 :(得分:0)
您想要ABCD54321
的正则表达式 - 仅匹配:
ABCD54321(?!\.aaa)
这将匹配ABCD54321
后面没有.aaa
。
如果您希望它不区分大小写,请先使用CASE_INSENSITIVE
标记Pattern.compile()
进行准备:
Pattern.compile("abcd54321(?!\\.aaa)", Pattern.CASE_INSENSITIVE);
答案 2 :(得分:0)
您有以下代码:
String[] patternValues =
new String[] {"[Aa.][Bb][Cc][Dd]\\d+\\.+[a-zA-Z]{3}", "[Aa.][Bb][Cc][Dd]\\d+"};
将其更改为:
String[] patternValues =
new String[] {"(?i)^abcd\\d+\\.+[a-z]{3}$", "(?i)^abcd\\d+$"};
重要的变化是:
?i => Ignore case match
^ and $ => line start and line end