Regex extraire des 3 premiers mots à partir d'une chaîne
Je suis en train de remplacer tous les mots, sauf les 3 premiers mots de la Chaîne (à l'aide de textpad).
Ex valeur: This is the string for testing.
Je veux extraire juste 3 mots: This is the
à partir de ci-dessus de chaîne et supprimer tous les autres mots.
J'ai compris les regex pour faire correspondre les 3 mots (\w+\s+){3}
mais j'ai besoin de correspondre à tous les autres mots, sauf les 3 premiers mots et de supprimer les autres mots. Quelqu'un peut m'aider avec ça?
- Quelle langue utilisez-vous cette? Si vous pouvez faire correspondre les 3 premiers mots de votre satisfaction, en rejetant la chaîne d'origine & il suffit de le remplacer par le contenu de votre match semble plus efficace.
- C'est le genre de bodged ensemble, mais il semble fonctionner sur la phpliveregex.com/p/3jo.
^((\w+\s+){3})(.*)$
. Avec cela, vous obtenez... tout, les 3 premiers, les 3ème et puis le reste... vous ne savez Pas comment vous pourriez l'utiliser à partir de là, si. Pas sûr de savoir comment cela fonctionne pour Textpad comme je n'ai aucune idée de ce que c'est. - l'affiche dit textpad. Textpad états "Son puissant moteur d'expression régulière est compatible avec Perl et JavaScript."
- exactement, l'OP ajoutée "à l'aide de textpad" après je lui ai demandé ce qu'il a utilisé. Par conséquent, le succès de commentaire, le travail est accompli, je ne sais pas textpad, donc je m'incline pour le reste 😉
- Oh mon dieu, désolé. Toujours obtenir une poignée sur la réponse à des questions sur un Débordement de Pile. Merci pour l'explication!
Vous devez vous connecter pour publier un commentaire.
Exactement comment dépend de la saveur, mais aussi d'éliminer tout, sauf les trois premiers mots, vous pouvez utiliser:
qui capture les trois premiers mots dans la capture d'un groupe 1, ainsi que le reste de la chaîne. Pour votre chaîne de remplacement, vous devez utiliser une référence à la capture d'un groupe 1. En C#, il pourrait ressembler à:
EDIT: Ajouté au début de la ligne d'ancrage à chaque regex, et a ajouté TextPad des indicateurs spécifiques.
Si vous souhaitez éliminer les trois premiers mots, et de capturer le reste,
?:
changements les trois premiers mots d'un non-capture d'un groupe, et de capter tout ce qui est après elle.Est-ce que vous cherchez? Je ne suis pas totalement clair sur votre question ou votre objectif.
Comme l'a suggéré, ici est le contraire. Capturer les trois premiers mots seulement, et jeter le reste:
Il suffit de déplacer l' ?: de la première à la deuxième groupement.
Autant que remplacement qui a capturé groupe, que voulez-vous à la place? Pour remplacer chaque mot individuellement, vous devez capturer chaque mot individuellement:
Et puis, par exemple, vous pouvez remplacer chacune avec sa première lettre en majuscule:
Remplacer par:
\u$1 \u$2 \u$3
Résultat est
This Is The
Dans TextPad, minuscules
\u
dans le remplacement des moyens de modifier uniquement la lettre suivante. Majuscules\U
change tout après (jusqu'à la prochaine capitalisation drapeau).Essayer:
http://fiddle.re/f3hgv
(appuyez sur la touche [Java] ou n'importe quel langage est le plus pertinent. Notez que \u n'est pas pris en charge par RegexPlanet.)
À venir à partir d'une double question, je vais poster une solution qui fonctionne pour les "traditionnels" regex implémentations qui ne prennent pas en charge les extensions Perl
\s
,\W
, etc. Les nouveaux arrivants qui ne connaissent pas, même avec le fait qu'il existe différents dialectes (aka saveurs) des expressions régulières est conseillé de lire par exemple Pourquoi il y a tant de différents expression régulière dialectes?Si vous avez POSIX classe de soutien, vous pouvez utiliser
[[:alpha:]]
pour\w
,[^[:alpha:]]
pour\W
,[[:space:]]
pour\s
, etc. Mais si nous supposons que l'espace blanc sera toujours un espace et que vous voulez extraire les trois premiers jetons entre les espaces, vous n'avez pas vraiment besoin de même que l'.correspond à trois jetons séparés par des pistes de l'espace. (J'ai mis des espaces entre parenthèses pour les faire ressortir, et facile à étendre, si vous souhaitez inclure d'autres personnages que sur un seul régulière de l'espace ASCII dans le jeton séparateur de jeu. Par exemple, si votre regex dialecte accepte
\t
pour une tabulation, ou vous êtes capable de coller un onglet standard à sa place, vous pouvez l'étendre àDans la plupart des coques, vous pouvez taper un littéral de l'onglet ctrl+v tab, c'est à dire préfixe avec un code d'échappement, ce qui est souvent tapé en maintenant la ctrl enfoncée et en tapant v.)
D'utiliser effectivement de cela, vous pourriez vouloir faire
où les guillemets simples sont nécessaires pour protéger la regex à partir de l'interpréteur de commandes (double devis travaux ici aussi, mais sont plus faibles, ou backslashing chaque caractère dans la regex qui a une signification pour le shell comme un caractère de remplacement) ou peut-être
de remplacer chaque ligne avec juste la capture d'expression (les parenthèses faire une capture d'un groupe, que vous pourrez consulter avec
\1
dans la pièce de remplacement dans les
commande ensed
). Le-r
option sélectionne un légèrement plus plein de fonctionnalités regex dialecte que le bare-bones traditionnelsed
; si votresed
ne l'a pas, essayez-E
, ou de mettre une barre oblique inverse avant chaque parenthèse et signe.En raison de la façon dont les expressions régulières de travail, les première trois est facile parce que un moteur d'expression régulière retournera toujours la première correspondance possible sur une ligne. Si vous voulez trois jetons de départ de la deuxième, vous avez à mettre dans une benne expression. L'adaptation de la
sed
script ci-dessus, qui seraitoù vous noterez que j'ai mis dans un jeton+non-jeton de groupe avant la capture. (Ce n'est pas vraiment possible avec
grep -o
sauf si vous avezgrep -P
auquel cas toute la gamme des extensions Perl est disponible pour vous de toute façon.)Si votre regex dialecte prend en charge {m,n} répétition, vous pouvez bien sûr refactoriser l'expression régulière à utiliser. Si vous avez besoin d'un grand nombre de répétitions, c'est certainement à la fois plus lisible et plus facile à gérer. Assurez-vous de ne pas ajouter des parenthèses où vous briser la référence arrière commande (la première parenthèse ouvrante crée le premier groupe
\1
, la deuxième\2
, etc.)Remarquez comment le deuxième groupe entre parenthèses est nécessaire de préciser le champ d'application de la
{2}
répétition (nous voulons plus que le seul caractère immédiatement avant l'accolade gauche). L'OP tentative avait une erreur où la répétition a été spécifié à l'extérieur de la dernière parenthèse; puis, le dos de référence\1
(ou quelque chose comme ça dans votre dialecte -- TextMate semble utiliser$1
, tout comme Perl) se réfèrent au dernier match de la parenthèse capturante, parce que la répétition ne fait pas partie de la capture, étant en dehors de la parenthèse capturante.