Java 如何解析一个字符串并获取每一个子字符串一次?

Java 如何解析一个字符串并获取每一个子字符串一次?,java,string,substring,Java,String,Substring,我想制作一个程序,让它按照顺序返回一个ArrayList和一个字符串中的每个子字符串 static boolean tropChangements(String branche, int ocurrTaches) { ArrayList dispositif = new ArrayList(); String pub = "[public]"; String priv = "[private]"; String branc

我想制作一个程序,让它按照顺序返回一个ArrayList和一个字符串中的每个子字符串

     static boolean tropChangements(String branche, int ocurrTaches) {
        ArrayList dispositif = new ArrayList();
        String pub = "[public]";
        String priv = "[private]";
        String brancheDecoup;
        int ptVirg = branche.indexOf(" ; ");
        for(int i = 0; i<ocurrTaches; i++) {
            brancheDecoup = [...] //use ptVirg
            if (brancheDecoup.contains(pub)) {
                dispositif.add("public");
            } else if (branche.contains(priv)) {
                dispositif.add("private");
            }
        }

        //[...] It's OK here
    }
所以,我想在BrancheDecoup中只显示我的子字符串的第一次出现,以及下一个、下一个等。字符串的结尾是一个

我的字符串,例如: EcrireNomEtudiant[公共];EnterMDP[私人];AvecQui[私人];唱诗班;VerifDisponibilite[系统];宣誓就职[私人];特使拉德曼德[系统]

我希望这个结果->

在ArrayList中:public、private、private、perso、private

事先非常感谢

致以最良好的祝愿,
Vincent。

您可以先拆分字符串,然后使用正则表达式匹配模式

    Pattern p = Pattern.compile("\\[(.*?)]");
    String str = "EcrireNomEtudiant[public] ; EntrerMDP[private] ; AvecQui[private] ; ChoisirJour[perso] ; VerifDisponibilites[system] ; AfficherRecupilatif[private] ; EnvoyerLaDemande[system]";

    Function<String, String> finder = s -> {
        Matcher m = p.matcher(s);
        return m.find() ? m.group(1) : null;
    };
    List<String> list = Arrays.stream(str.split(";"))
        .map(finder)
        .collect(Collectors.toList());
    System.out.println(list);

您可以先拆分字符串,然后使用正则表达式匹配模式

    Pattern p = Pattern.compile("\\[(.*?)]");
    String str = "EcrireNomEtudiant[public] ; EntrerMDP[private] ; AvecQui[private] ; ChoisirJour[perso] ; VerifDisponibilites[system] ; AfficherRecupilatif[private] ; EnvoyerLaDemande[system]";

    Function<String, String> finder = s -> {
        Matcher m = p.matcher(s);
        return m.find() ? m.group(1) : null;
    };
    List<String> list = Arrays.stream(str.split(";"))
        .map(finder)
        .collect(Collectors.toList());
    System.out.println(list);
试试这个:

import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        String sample = "EcrireNomEtudiant[public] ; EntrerMDP[private] ; AvecQui[private] ; ChoisirJour[perso] ; VerifDisponibilites[system] ; AfficherRecupilatif[private] ; EnvoyerLaDemande[system].";
        tropChangements(sample);
    }

    static void tropChangements(String branche) {
        Set<String> dispositif = new HashSet<String>(); // use Set so that there will be no duplicates
        String[] branches = branche.split(";"); // use split method to split string by ";"
        for (String s : branches) { // iterate string
            int indexOfOpen = s.indexOf("["); // get the index of "["
            int indexOfClose = s.lastIndexOf("]"); // get the index of "]"
            if (indexOfOpen > 0 && indexOfClose > 0) { // check if both "[" and "]" is found
                String tmp = s.substring(indexOfOpen + 1, indexOfClose); // get the needed string
                dispositif.add(tmp); //add it to the set
            }
        }
        System.out.println(dispositif); // print the set

    }
}
结果:[个人、私人、系统、公共]

尝试以下操作:

import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        String sample = "EcrireNomEtudiant[public] ; EntrerMDP[private] ; AvecQui[private] ; ChoisirJour[perso] ; VerifDisponibilites[system] ; AfficherRecupilatif[private] ; EnvoyerLaDemande[system].";
        tropChangements(sample);
    }

    static void tropChangements(String branche) {
        Set<String> dispositif = new HashSet<String>(); // use Set so that there will be no duplicates
        String[] branches = branche.split(";"); // use split method to split string by ";"
        for (String s : branches) { // iterate string
            int indexOfOpen = s.indexOf("["); // get the index of "["
            int indexOfClose = s.lastIndexOf("]"); // get the index of "]"
            if (indexOfOpen > 0 && indexOfClose > 0) { // check if both "[" and "]" is found
                String tmp = s.substring(indexOfOpen + 1, indexOfClose); // get the needed string
                dispositif.add(tmp); //add it to the set
            }
        }
        System.out.println(dispositif); // print the set

    }
}

结果:[个人、私人、系统、公共]

我不确定我是否完全理解您试图做的事情,但这将为您提供您期望的输出:

    List<String> dispositif = new ArrayList<>();
    Pattern re = Pattern.compile("\\[(public|private|perso)\\]");
    Matcher matcher = re.matcher(branche);
    while (matcher.find()) {
        dispositif.add(matcher.group(1));
    }

我不确定我是否完全理解您试图做的事情,但这将为您提供您期望的输出:

    List<String> dispositif = new ArrayList<>();
    Pattern re = Pattern.compile("\\[(public|private|perso)\\]");
    Matcher matcher = re.matcher(branche);
    while (matcher.find()) {
        dispositif.add(matcher.group(1));
    }
考虑lib的使用,这使得上面的@sidgate代码更加清晰

因此,完整的列表将是:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang.StringUtils;

public class Example {

  static String sample =
      "EcrireNomEtudiant[public] ; EntrerMDP[private] ; AvecQui[private] ; ChoisirJour[perso] ; VerifDisponibilites[system] ; AfficherRecupilatif[private] ; EnvoyerLaDemande[system]";

  public static void main(String[] args) {
    tropChangements(sample);
  }

  static void tropChangements(String branche) {
    List<String> list = Arrays
        .stream(branche.split(";"))
        .map(String::trim)
        .map(s -> StringUtils.substringBetween(s, "[", "]"))
        .collect(Collectors.toList());
    System.out.println(list);
  }
}
考虑lib的使用,这使得上面的@sidgate代码更加清晰

因此,完整的列表将是:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang.StringUtils;

public class Example {

  static String sample =
      "EcrireNomEtudiant[public] ; EntrerMDP[private] ; AvecQui[private] ; ChoisirJour[perso] ; VerifDisponibilites[system] ; AfficherRecupilatif[private] ; EnvoyerLaDemande[system]";

  public static void main(String[] args) {
    tropChangements(sample);
  }

  static void tropChangements(String branche) {
    List<String> list = Arrays
        .stream(branche.split(";"))
        .map(String::trim)
        .map(s -> StringUtils.substringBetween(s, "[", "]"))
        .collect(Collectors.toList());
    System.out.println(list);
  }
}
你知道Stringsplit函数吗?如果是,那就试试看。您的代码将变得更容易您知道Stringsplit函数吗?如果是,那就试试看。您的代码将变得更加简单