6
votes

Regexp détecte-t-il plusieurs instances à une seule lettre d'affilée?

Donc, je fais un programme pour analyser Twitch Chat, et je me demande s'il y a une manière que je puisse utiliser Regex pour analyser le résultat souhaité:

"f o o b a r" dans "foobar"

jusqu'à présent, le code que j'ai est / (?: (\ w) \ s) {3,} / g et cela fonctionne dans une certaine mesure, mais examinez la situation suivante:

"frankerz riot frankerz" capture "t" (la dernière lettre de "riot" ) et sélectionne "zriot"

Ce que je voudrais, c'est que cela veuille comprendre comment détecter s'il y a une seule lettre avec un espace avant et après, et s'il y en a au moins 3 de ceux d'une rangée (donc "test AB test " n'est pas sélectionné comme ab , ne capture que s'il y a 3 +)

Toute aide? Merci!


0 commentaires

7 Réponses :


-1
votes

Plutôt que d'utiliser une regex, vous pouvez créer une fonction qui prend une chaîne, scindre la chaîne dans un espace puis renvoie toutes les lettres simples

    function findSingleLetters(string){
        var split = string.split(" ");
        var word= [];
        for(int i=0;i<split.length; i++){
            if(split[i].length==1){
               word.push(split[i]);
            }
        }
        return word.toString().replace(/,/g,"");  //join the word array and replace all the remaining commas(,)
    }


1 commentaires

Cela ne voudrait-il pas simplement me donner tous les mots de la seule lettre? Et si quelqu'un dit "c'est un test, une émeute" , il vous donnerait "a, r, i, o, t" , c'est pourquoi je veux seulement Il doit commencer à capturer quand il y a 3+ instances de lettres simples d'affilée. Avez-vous une idée de ce que j'inclus dans le code que vous avez écrit?



-1
votes

\ b est une affirmation de largeur zéro qui correspond à l'écart entre une charte de mots et un caractère de non-mot. Par exemple, / \ b \ w \ s / correspond au r dans rz ri , mais pas le z : Le z ne suit pas une "pause de mots" ou un commutateur entre les caractères Word et non-Word. Essayez de mettre cela au début de votre regex, de montrer que vous ne voulez pas que cela commence à faire correspondre au milieu d'un mot.


1 commentaires

Merci! C'était exactement ce dont j'avais besoin, je voudrais + représentant mais n'ayez pas vraiment assez de réputation moi-même afin de. Je posterai ma réponse à cela. Merci encore :)



3
votes

Essayez ce motif: / (?: \ b \ w (?: \ s.ca | $)) {3,} / g code>

Ceci utilise le métacaracter \ b code> Vous obtenez donc une correspondance de mot entière appropriée au lieu du match partiel que vous avez vu avec frankerz code>. En outre, le bit \ S | $ code> La dernière lettre étant perdue lorsqu'aucun espace ne l'excède, par exemple, le "T" dans émeute code>. P>

Exemple: P>

var inputs = [
  "R I",
  "R I O T",
  "FrankerZ R I O T FrankerZ",
  "f o o b a r"
];

var re = /(?:\b\w(?:\s|$)){3,}/g;

inputs.forEach(function(s) {
  var match = s.match(re);
  if (match) {
    var result = match[0].replace(/\s/g, '');
    console.log('Original: ' + s);
    console.log('Result: ' + result);
  } else {
    console.log('No match: ' + s);
  }
});


4 commentaires

Oui, cela a fonctionné, mais toujours appliqué à "R i" et à "R i o" lorsque je voudrais seulement qu'il appliquera à 3 mots de 3 lettres ou plus. J'ai posté ma réponse qui fait quelque chose de similaire à cela, mais travaille avec mon scénario. Merci!


Au lieu du quantificateur + , utilisez {3,} .


@Flipybitz facilement corrigé en utilisant {3,} au lieu de + .


@Purag Yep, c'est à peu près ce que j'ai fait dans ma solution mais Ahmad m'a battu à cela: p



1
votes

Merci à Sam Burns pour suggérer l'utilisation de \ b. Ce qui fonctionne pour moi était:

/ \ b (((?: \ w? \ b) {3,}) / g

Cela sélectionnerait les éléments suivants:

H y p e de frankerz h y p e frankerz , et f o o b a r (ne finit pas ou commence par un caractère d'espace, me donnait des problèmes)

Spécification de l'espace littéral "" caractère au lieu de \ s était également important pour éviter les pauses de ligne et les autres instances lorsque je ne voulais que vérifier que le personnage de l'espace le premier endroit.

Pour le remplacer sans espaces, je vais simplement faire .replace ("", "") pour recevoir le résultat exact que je voulais. Merci encore pour l'aide de chacun :)


0 commentaires

1
votes

Voici une bonne référence Comment remplacer par des matchs Remplacer JavaScript par référence à Groupe assorti?

Donc, vous pourriez faire: xxx

voir Demo


0 commentaires

0
votes

Vous allez avoir du mal à résoudre ce problème avec des expressions régulières seules.

C'est-à-dire qu'il n'y a pas d'expression régulière qui fera toutes les opérations suivantes: p>

  • Ne rien sélectionner que vous n'êtes pas intéressé par li>
  • Capturez tout ce qui vous intéresse LI>
  • capturer un nombre variable de correspondances li> ul>

    La dernière exigence - un nombre variable de captures - est le gros. Stackoverflow User Tomalak décrit la situation assez bien : P>

    Les groupes sont définis par des parenthèses de Thorugh. Votre résultat de match contiendra autant de groupes que des paires de parenthèses dans votre regex (à l'exception des parenthèses modifiées comme (?: ...) qui ne compteront pas vers les groupes de matchs). Vous voulez deux matchs de groupe distincts dans votre résultat de match? Définissez deux groupes distincts dans votre regex. P>

    Si un groupe peut correspondre à plusieurs fois, la valeur du groupe sera tout ce qu'elle correspondait en dernier. Toutes les occurrences de match précédentes pour ce groupe seront remplacées par son dernier match. P> BlockQuote>

    Vous pouvez toujours laisser une expression régulière beaucoup em> du travail, cependant, par exemple à l'aide de l'ancrage \ B CODE> Boundary-of Word. Cela ressemble beaucoup à ce que vous avez décrit comme "un espace avant et après" mais est plus proche de ce que vous voulez parce qu'il ne correspond pas (ni ne nécessite même) l'espace lui-même. P>

    var individual_letters_re = /\b\w\b/g;
    
    function hiddenWord(sentence) {
        letters = sentence.match(individual_letters_re);
        if (letters && letters.length >= 3) {
            return letters.join("");
        }
        return "";
    }
    
    > hiddenWord("R I O T")
    "RIOT"
    > hiddenWord("FrankerZ R FrankerZ I FrankerZ O FrankerZ T")
    "RIOT"
    > hiddenWord("test a b test")
    ""
    > hiddenWord("test a b c test")
    "abc"
    


0 commentaires

0
votes

Essayez ceci sur votre terminal / navigateur / console: xxx

espère que cela répond aux besoins.


0 commentaires