0

希望做得好..我正在尝试删除不匹配的数据,同时使用 java 与正则表达式进行比较。我的要求是这样的。我的正则表达式是:

([A-Z]{5}[0-9]{4}[A-Z])(XM|XD|EM|ED)([0-9]{3})(_PRA_)([0-9]{3})

它应该接受这样的字符串:

SHIVA1234AXM123_PRA_123

但是在这种情况下,如果我给出任何东西aaSHIVA1234AXM123_PRA_123aa(或)SHIVA1234AXccccM123_PRA_123像这种方法应该给出aaaa(或)cccc这样。我尝试了以下代码:

public class ExpressionDemo {
    public static void main(String[] args) {
        String regex = "([A-Z]{5}[0-9]{4}[A-Z])(XM|XD|EM|ED)([0-9]{3})(_PRA_)([0-9]{3})";
        Pattern p = Pattern.compile(regex);

        String str="SHIVA1234AXM123_PRA_123";
        Matcher m = p.matcher(str);  
        System.out.println(m.groupCount());

        for(int i=1;i<=m.groupCount();i++)
        {
            int start=0;
            int end=0;
            System.out.println("count "+i);
            if(m.lookingAt())
            {
                System.out.println(m.group(i));
                System.out.println("start of group"+m.start(i));
                System.out.println("end of group"+m.end(i));
                start=m.start(i);
                end=m.end(i);
                m.reset();
            }
            else
            {
                System.out.println("ELSE");
                System.out.println(start);
                System.out.println(end);
            }
        }
    }
}

这是针对正面案例,但我需要针对虚假案例。它应该是通用的任何表达式--->字符串。

4

2 回答 2

1

因此,在“否定情况”中,您有一个可能被另一个字符串“中断”的连续字符串(字符之间没有空格),并且您想要匹配该“中断器”字符串,对吗?

我能想到的唯一方法是在每个“有效”字符之间捕获所有连续的非空白字符。这将是非常非常丑陋的:

(\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[0-9](\S*?)[0-9](\S*?)[0-9](\S*?)[0-9](\S*?)[A-Z](\S*?)(?:X|E)(\S*?)(?:M|D)(\S*?)[0-9](\S*?)[0-9](\S*?)[0-9](\S*?)_(\S*?)P(\S*?)R(\S*?)A(\S*?)_(\S*?)[0-9](\S*?)[0-9](\S*?)[0-9](\S*)
^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^       ^^^^^^       ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^

如果我数对了,这里有 24 个捕获组。将它们全部连接起来!

编辑

顺便说一句,您可以使用\d而不是[0-9]保存几个字符:

(\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)\d(\S*?)\d(\S*?)\d(\S*?)\d(\S*?)[A-Z](\S*?)(?:X|E)(\S*?)(?:M|D)(\S*?)\d(\S*?)\d(\S*?)\d(\S*?)_(\S*?)P(\S*?)R(\S*?)A(\S*?)_(\S*?)\d(\S*?)\d(\S*?)\d(\S*)
^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^  ^^^^^^  ^^^^^^  ^^^^^^  ^^^^^^     ^^^^^^       ^^^^^^       ^^^^^^  ^^^^^^  ^^^^^^  ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^  ^^^^^^  ^^^^^^  ^^^^^
于 2012-11-02T07:42:44.543 回答
0

您必须使用if (m.matches())or - 在其他情况下 - while (m.find())

例如,要查看前面可能添加的内容,请在该位置添加(.*)

//              1   2                      3
String regex = "(.*)([A-Z]{5}[0-9]{4}[A-Z])(XM|XD|EM|ED)([0-9]{3})(_PRA_)([0-9]{3})";


Matcher m = p.matcher(str);
if (m.matches()) {
    System.out.println("Extra in front: '" + m.group(1) + "'");
}
于 2012-11-02T07:32:30.183 回答