Extraire des éléments en remplaçant une expression régulière d'une grande quantité de HTML avec java

Ce que je veux faire cette fois

Lire des données texte HTML, lues avec java, après les avoir mises dans la liste Lisez les données String de la liste, remplacez-les par une expression régulière, traitez-les et enregistrez-les dans tous.

supposition

Traitement par lots d'un grand nombre de fichiers similaires L'ajout à la liste ligne par ligne de la lecture du fichier avec java est terminé.

avantage

Vous pouvez enregistrer des données bloquées dans la même expression régulière qu'une autre Prend en charge plusieurs hits Le nombre de données ne change pas en effectuant un traitement d'exception en l'absence de hit

spécification

Rechercher toutes les données de String dans la liste Lorsque les données souhaitées sont trouvées, elles sont remplacées et stockées dans tous (String). À partir de quel numéro stocker les données souhaitées Que faire quand il n'y a pas de données souhaitées peut être décidé par l'argument Aucune opération du tout lorsque "" À d'autres moments, le caractère spécifié est ajouté et séparé par des virgules.

argument sens
be String avant le remplacement de l'expression régulière
af Chaîne après remplacement d'expression régulière
no Chaîne de caractères non interceptée lors de la recherche
s À combien de hits pensez-vous?
num Combien de hits à penser
be_set Lancer la recherche après avoir frappé la chaîne de caractères saisie ici
af_set Termine la recherche lorsque la chaîne de caractères saisie ici est frappée

Flux de code source

--Pour tous les éléments de liste

--Pour tous les éléments de sauvegarde

Comment appeler

call


sp("<.+><.+-(.+)\"></i></div>"
,"$1q"
,"noq"
,1
,14
,"<.+>Tableau des données 1</h3>"
,"<.+>Tableau des données 2</h3>");

Dans un tel cas, écrivez en HTML Tableau des données 1 De Tableau des données 2 Avec des éléments jusqu'à <.+><.+-(.+)\"></i></div> Ce qui frappe l'expression régulière de $1q Remplacer par ($ 1 est le symbole de remplacement après l'atteinte dans le remplacement d'expression normal. L'appel entre parenthèses est traité comme un élément tel quel. Quand il n'y a pas de données noq Il s'agit d'un processus pour déplacer l'emplacement de la cellule de données s'il s'agit d'une ligne vide lors de son traitement ultérieur.

Après cela, une virgule est ajoutée et le processus se termine. Comme avantage, même si les formats des données 1 et des données 2 sont les mêmes, des données correctes peuvent être obtenues correctement.

Code source

grobal



ArrayList<String> list = new ArrayList<String>();
String all = "";
String qq = "qqqqqqqqq";  //Une chaîne qui ne frappera pas
public static void add_all(String index){
    all = all + index + kn;
//kn est un délimiteur de données lors de l'ajout de données lors du débogage"\n"Au moment de la libération","conseillé
}

over


//Surcharge avec moins d'arguments
//qq est une chaîne qui ne semble pas frapper
//Recherchez toujours un élément lorsqu'il y a trois arguments
public static void sp(String be,String af,String no){
    int s = 1; int num =1;
    sp(be,af,no,s,num,qq,qq);
  }
  public static void sp(String be,String af,String no,int s,int num){
    sp(be,af,no,s,num,qq,qq);
  }

sp


public static void sp(String be,String af,String no,int s,int num ,String be_set,String af_set){
  int i;
  boolean be_flag = false;
  boolean af_flag = false;
  boolean cutset = false;
  //Si l'indicateur de début / fin n'est pas entré, effectuez une recherche complète.
  if(be_set.equals(qq) && af_set.equals(qq)){
    be_flag=true;
  }
  //Lorsque le nombre de résultats de recherche est de un, un traitement à grande vitesse est possible avec l'indicateur cutset.
  if(s ==1 && num ==1){
    cutset = true;
  }
  ArrayList<String> save = new ArrayList<String>();
  save.clear();//Je n'en ai pas besoin, mais pour le moment
  //Répéter pour la taille de la liste
  for(i = 0;i < list.size();i++){
    //Obtenir les données de la liste
    String line = list.get(i);
    //Démarrer l'opération de drapeau
    if(line.matches(be_set)){
      be_flag=true;
    }
    //Fin de l'opération de drapeau
    if(line.matches(af_set) && be_flag){
      break;
    }
    if(line.matches(be) && be_flag){
      line = line.replaceAll(be,af);
      save.add(line);
      deb(0,line);
      //Vise à accélérer le traitement lorsqu'une seule donnée est recherchée
      if(cutset){
        String tem = save.get(0);
        add_all(tem+",");
        return;
      }
    }
  }

  //Après avoir lu toutes les données
  //Quand il n'y avait pas de coup
  //Les données après remplacement""Sinon, ajoutez l'argument no
  if(save.size() == 0){
    if(!no.equals(""))add_all(no);
  //Quand non
  }else{
    //Traitement des exceptions: aligner le nombre d'entrées et le nombre de hits
    if(save.size() < num){
      num = save.size();
    }
    if(save.size() < s){
      s = save.size();
    }
    //Ajouter uniquement le montant spécifié dans l'argument à tous
    for(i=0;i<num;i++){
      String tem = save.get(s+i-1);
      add_all(tem);
    }
  }
  //Séparé par des virgules après la réflexion des données
  if(!no.equals(""))add_all(",");
}

Épilogue

C'est le résultat d'ajouter ce dont j'ai besoin sans penser à la structure, mais pour moi, je pense que ce n'est pas mal. Je l'ai utilisé pour lire des données HTML. Je pense que c'est correct d'utiliser la bibliothèque python, mais j'ai pris ce format parce que je n'ai pas tardé à avoir l'idée.

Recommended Posts

Extraire des éléments en remplaçant une expression régulière d'une grande quantité de HTML avec java
[Java] Découpez une partie de la chaîne de caractères avec Matcher et des expressions régulières
Extraire une chaîne de caractères commençant par une majuscule avec une expression régulière (Ruby)
Remplacer par une valeur selon la correspondance avec une expression régulière Java
Je veux extraire entre des chaînes de caractères avec une expression régulière
[Android-Kotlin] Convertir le préfixe m et le préfixe s, qui sont des problèmes avec java en kotlin, sont supprimés par le remplacement des expressions régulières.
<java> Fractionner l'adresse avant et après l'adresse avec une expression régulière
Extraire une partie d'une chaîne en Ruby
(Java) Comment implémenter equals () pour une classe avec des éléments de valeur ajoutés par héritage
[Java] Trier ArrayList avec des éléments de votre propre classe
Extraire les éléments dans l'ordre du type de classe ArrayList
Appeler une méthode avec le bloc de rappel de Kotlin depuis Java
[Note] Créez un environnement Java à partir de zéro avec docker
Chaîne Remplacement des cas où un saut de ligne est inclus dans * dans l'expression régulière de la condition de recherche