Grep字符序列

时间:2013-08-12 18:20:54

标签: java regex

我需要匹配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}}

3 个答案:

答案 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