-3

我需要匹配 form 的字符序列和 form 的ABCD12345其他字符序列ABCD54321.aaa

我编写了代码来检查这两种形式,但它只适用于输入序列ABCD12345,因为ABCD54321.aaa它与 RegEx 匹配(一个 forABCD54321.aaa和一个 for ABCD54321)。

如何修改我的正则表达式,以便在输入为 时只有其中一个匹配ABCD54321.aaa

这是我的 java 代码片段,它显示了我用来匹配字符序列的模式:

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]);
    ..... 
}
4

3 回答 3

1

假设您使用的是 Java,并且您有 2 个不同的 RegEx 按顺序检查aMatcher.matches(),您可以向 RegEx 添加一个负前瞻,它只匹配“ABCD12345” 而不是“ABCD54321.aaa”),即"[A-Z]{4}[0-9]{5}(?!\\.[a-z]{3})". "(?!\\.[a-z]{3})"是负前瞻。

第二种选择是只保留一个正则表达式(匹配两者的那个),检索匹配的文本(通过aMatcher.group())并决定aMatcher.group().length()(应该是 9 或 13)。

如果您更喜欢使用aString.matches(aRegEx),那么唯一的选择是第一个。

于 2013-08-12T18:33:53.640 回答
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
于 2013-08-12T18:40:35.080 回答
0

你想要这个正则表达式用于ABCD54321-only 匹配:

ABCD54321(?!\.aaa)

那将匹配ABCD54321不跟随的.aaa.

如果您希望它不区分大小写,请首先Pattern.compile()使用以下CASE_INSENSITIVE标志进行准备:

Pattern.compile("abcd54321(?!\\.aaa)", Pattern.CASE_INSENSITIVE);
于 2013-08-12T18:35:41.387 回答