跳过第一次出现并拆分Java中的字符串

跳过第一次出现并拆分Java中的字符串,java,regex,Java,Regex,如果出现次数不超过4次,我想跳过第一次出现。现在,我将获得最多5个数字下划线。我需要生成输出A_B,C,D,E,F,我使用了下面的代码。我想要更好的解决方案。请检查一下,让我知道。提前谢谢 String key = "A_B_C_D_E_F"; int occurance = StringUtils.countOccurrencesOf(key, "_"); System.out.println(occurance); String[] keyValues = null; if(occuranc

如果出现次数不超过4次,我想跳过第一次出现。现在,我将获得最多5个数字下划线。我需要生成输出A_B,C,D,E,F,我使用了下面的代码。我想要更好的解决方案。请检查一下,让我知道。提前谢谢

String key = "A_B_C_D_E_F";
int occurance = StringUtils.countOccurrencesOf(key, "_");
System.out.println(occurance);
String[] keyValues = null;
if(occurance == 5){
    key = key.replaceFirst("_", "-");
    keyValues = StringUtils.tokenizeToStringArray(key, "_");
    keyValues[0] = replaceOnce(keyValues[0], "-", "_");
}else{
    keyValues = StringUtils.tokenizeToStringArray(key, "_");
}

for(String keyValue : keyValues){
    System.out.println(keyValue);
}

您可以使用此正则表达式拆分:

String s = "A_B_C_D_E_F";
String[] list = s.split("(?<=_[A-Z])_");
String s=“A_B_C_D_E_F”;

String[]list=s.split((?您可以基于
\G
使用此正则表达式,而不是使用匹配来拆分:

String str = "A_B_C_D_E_F";
Pattern p = Pattern.compile("(^[^_]*_[^_]+|\\G[^_]+)(?:_|$)");
Matcher m = p.matcher(str);
List<String> resultArr = new ArrayList<>();
while (m.find()) {
    resultArr.add( m.group(1) );
}
System.err.println(resultArr);

我会在分手后再做

public void test() {
    String key = "A_B_C_D_E_F";
    String[] parts = key.split("_");
    if (parts.length >= 5) {
        String[] newParts = new String[parts.length - 1];
        newParts[0] = parts[0] + "-" + parts[1];
        System.arraycopy(parts, 2, newParts, 1, parts.length - 2);
        parts = newParts;
    }
    System.out.println("parts = " + Arrays.toString(parts));
}
那么相对来说比较“简单”:

String str=“A_B_C_D_E_F_G”;

String[]result=str.split((?虽然Java没有正式这么说,但是您可以在lookback中使用
*
+
,因为它们被实现为限制量词:
*
作为
{0,0x7fffff}
+
作为
{1,0x7FFFFFFF}
(请参阅)。因此,如果字符串不太长,您可以使用

String key = "A_B_C_D";       // => [A, B, C, D]
//String key = "A_B_C_D_E_F"; // => [A_B, C, D, E, F]
String[] res = null;
if (key.split("_").length > 4) {
    res = key.split("(?<!^[^_]*)_");
} else {
    res = key.split("_");
}
System.out.println(Arrays.toString(res));
String key=“A_B_C_D”/=>[A,B,C,D]
//String key=“A_B_C_D_E_F”/=>[A_B,C,D,E,F]
字符串[]res=null;
如果(键拆分(“”).length>4){

res=key.split(“(?如果它已经在工作,可能这属于代码检查。你的堆栈没有溢出。看一看。我不知道为什么会这样。嗨,Wiktor,谢谢你的帖子。它会满足我的需要。我会检查并理解它是如何工作的。@Abdul检查我的答案,用一个split()用一个小技巧调用。:-)现在我甚至取消了这个技巧。:-)作为旁注,唯一的问题是,一旦第二个字符的长度未定义,这就不再有效了。但对于这个例子来说,这非常有效。@KevinEsche很明显,您必须更改
[a-Z]
来匹配
\u
之间的任何内容,但想法完全相同,因为您不能在Java中使用
*
+
,而且您的解决方案也不尊重“如果存在超过4个则跳过”的要求。@BjörnKautler为什么不呢?我刚刚测试了
”(?嗯,实际上我想知道这是否可行,但请尝试
”(?如果有4个以上的下划线,这不符合只忽略第一个下划线的要求。我的版本符合。它现在确实符合这一要求。是的,尽管它现在需要两个拆分操作,但我的操作只有一个。:-)很酷。但是你的正则表达式模式对于不喜欢我们的外行来说并不是那么简单:)为了更好地理解,我添加了一个注释版本。:-)谢谢你的支持。不客气。我只是想知道你接受了一个错误的答案。
String str = "A_B_C_D_E_F_G";
String[] result = str.split("(?<!^[^_]*)_|_(?=(?:[^_]*_){0,3}[^_]*$)");
System.out.println(Arrays.toString(result));
String str = "A_B_C_D_E_F_G";
String[] result = str.split("(?x)                  # enable embedded comments \n"
                            + "                    # first alternative splits on all but the first underscore \n"
                            + "(?<!                # next character should not be preceded by \n"
                            + "    ^[^_]*          #     only non-underscores since beginning of input \n"
                            + ")                   # so this matches only if there was an underscore before \n"
                            + "_                   # underscore \n"
                            + "|                   # alternatively split if an underscore is followed by at most three more underscores to match the less than five underscores case \n"
                            + "_                   # underscore \n"
                            + "(?=                 # preceding character must be followed by \n"
                            + "    (?:[^_]*_){0,3} #     at most three groups of non-underscores and an underscore \n"
                            + "    [^_]*$          #     only more non-underscores until end of line \n"
                            + ")");
System.out.println(Arrays.toString(result));
String key = "A_B_C_D";       // => [A, B, C, D]
//String key = "A_B_C_D_E_F"; // => [A_B, C, D, E, F]
String[] res = null;
if (key.split("_").length > 4) {
    res = key.split("(?<!^[^_]*)_");
} else {
    res = key.split("_");
}
System.out.println(Arrays.toString(res));