【问题标题】:How to parse a string and get once per once a substring?如何解析字符串并每次获取一次子字符串?
【发布时间】:2019-11-14 23:07:03
【问题描述】:

我想制作一个程序,它如何按顺序返回一个带有每个子字符串(来自字符串)的 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[私人] ; ChoisirJour[个人] ; VerifDisponibilites[系统] ; AfficherRecupilatif[私人] ; EnvoyerLaDemande[系统]。

我想要这个结果 -->

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

非常感谢您。

最好的问候, 文森特。

【问题讨论】:

  • 你知道String#split函数吗?如果是,那就试试吧。你的代码会变得更简单

标签: java string substring


【解决方案1】:

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

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

【讨论】:

    【解决方案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】:

      考虑Apache Commons Lang 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】:

        试试这个:

        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]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-25
          • 2021-08-22
          • 2016-12-03
          • 2012-01-05
          相关资源
          最近更新 更多