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é: p>
jusqu'à présent, le code que j'ai est 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 Toute aide? Merci! P> "f o o b a r" dans "foobar" code> p>
/ (?: (\ w) \ s) {3,} / g code> et cela fonctionne dans une certaine mesure, mais examinez la situation suivante: p>
"frankerz riot frankerz" code> capture "t" (la dernière lettre de
"riot" code>) et sélectionne
"zriot" p " >
"test AB test " code> n'est pas sélectionné comme
ab code>, ne capture que s'il y a 3 +) p>
7 Réponses :
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(,) }
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" code>, il vous donnerait
"a, r, i, o, t" code>, 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?
\ b code> 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 / code> correspond au
r code> dans
rz ri code>, mais pas le
z code> : Le
z code> 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. P>
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 :)
Essayez ce motif: Ceci utilise le métacaracter Exemple: P> / (?: \ b \ w (?: \ s.ca | $)) {3,} / g code>
\ 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>
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);
}
});
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 + code>, utilisez
{3,} code>.
@Flipybitz facilement corrigé en utilisant {3,} code> au lieu de
+ code>.
@Purag Yep, c'est à peu près ce que j'ai fait dans ma solution mais Ahmad m'a battu à cela: p
Merci à Sam Burns pour suggérer l'utilisation de \ b. Ce qui fonctionne pour moi était: p>
Cela sélectionnerait les éléments suivants: p>
Spécification de l'espace littéral Pour le remplacer sans espaces, je vais simplement faire / \ b (((?: \ w? \ b) {3,}) / g code> p>
H y p e code> de
frankerz h y p e frankerz code>,
et
f o o b a r code> (ne finit pas ou commence par un caractère d'espace, me donnait des problèmes) p>
"" code> caractère au lieu de
\ s code> é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. p>
.replace ("", "") code> pour recevoir le résultat exact que je voulais. Merci encore pour l'aide de chacun :) p>
Voici une bonne référence Comment remplacer par des matchs Remplacer JavaScript par référence à Groupe assorti?
Donc, vous pourriez faire: p> voir Demo P> P>
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>
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"
Essayez ceci sur votre terminal / navigateur / console: espère que cela répond aux besoins. P> p>