J'essaie d'écrire une expression régulière pour extraire les derniers mots d'une phrase. Cependant, je n'arrive pas à le faire fonctionner.
var str = "Tell me about robin hood";
const TELL_ME_ABOUT_REGEX = /^Tell me about (\w+\s*)*/
if( str.match(TELL_ME_ABOUT_REGEX) ){
var matches = TELL_ME_ABOUT_REGEX.exec( str );
console.log( "user wants to know about ",matches);
}
J'essaie d'obtenir le mot "Robin Hood". Mais je ne me retrouve qu'avec "capuche".
[ 'Tell me about robin hood',
'hood',
index: 0,
input: 'Tell me about robin hood' ]
Que dois-je changer dans mon expression régulière?
4 réponses
Voici une expression rationnelle correcte:
^Tell me about ((?:\w+\s*)*)
Comparez à votre original qui est
^Tell me about (\w+\s*)*
C'est tellement fermé. Le fait est que vous devez utiliser le groupe sans capture pour un support interne et le groupe de capture pour un support externe.
Notez que (\w+\s*)*
à partir de votre expression régulière, il peut capturer robin
à \1
à la première fois, puis écrase hood
à \1
. Donc, maintenant, vous pourriez comprendre que le moteur regex fonctionnera de cette façon.
Le problème avec /^Tell me about (\w+\s*)*/
est qu'il y a plusieurs correspondances pour "Tell me about robin hood"
, c'est-à-dire que robin
est une correspondance possible, ainsi que robin\s
et ainsi de suite. Les caractères de répétition peuvent parfois vous dérouter, mais lorsque vous pensez à toutes les possibilités de correspondance, cela peut être plus clair. Pour faire correspondre tout ce qui est venu après Tell me about
, vous pouvez simplement tout obtenir en une seule fois, avec une seule correspondance possible: (.*)
.
Essaye ça
Tell me about ([\w\s]+)
(\w+\s*)*
capturera 'robin' puis 'hood' mais ne conservera que la dernière itération => 'hood'
Pourquoi avez-vous besoin d'expressions régulières pour cela? Vous pouvez le faire sans regex comme ça
var str = "Tell me about robin hood";
var str = str.split(" ").splice(3).join(" ");
alert(str);
http://codepen.io/anon/pen/aNvrYz
Modifier: Solution Regex
var str = "Tell me about robin hood";
var match = str.match(/^Tell me about (.*)/i);
var textInDe = match[1];
alert(textInDe);
http://codepen.io/anon/pen/BKoerY
Questions connexes
Questions liées
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.