有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何解析一个字符串并获得一个子字符串?

我想制作一个程序,它如何返回一个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”

事先非常感谢

致以最良好的祝愿, 文森特


共 (4) 个答案

  1. # 1 楼答案

    试试这个:

    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
    
        }
    }
    

    结果:[perso, private, system, public]

  2. # 2 楼答案

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

        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));
        }
    
  3. # 3 楼答案

    考虑^ {A1}<强> 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);
      }
    }
    
  4. # 4 楼答案

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

        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);