1
votes

Puis-je utiliser Split sur une chaîne deux fois de suite en utilisant la tuyauterie?

Disons que j'ai la chaîne suivante dog.puppy / cat.kitten / bear.cub . Je souhaite uniquement recevoir ours . Je peux le faire en exécutant ce qui suit:

$str = "dog.puppy/cat.kitten/bear.cub"
$str = $str.split('/')[2] | $_.split('.')[0]

Puis-je obtenir bear en utilisant une ligne en utilisant la tuyauterie? Cela ne fonctionne pas, mais ce serait quelque chose comme ceci:

$str = "dog.puppy/cat.kitten/bear.cub"
$str = $str.split('/')[2]
$str = $str.split('.')[0]


0 commentaires

3 Réponses :


3
votes

Vous pouvez faire ceci:

$str = "dog.puppy/cat.kitten/bear.cub".split('/')[2].split('.')[0]

Aucune tuyauterie nécessaire.


3 commentaires

Merci, cela fonctionne parfaitement. Ensuite, je dois diviser la chaîne en majuscules, alors disons que la chaîne était dog.puppy / cat.kitten / bearOneTwoThree.cub , et j'ai besoin du résultat bear One Two Three < / code> qui est réalisé en utilisant -creplace ". (? = [^ az])", "$ &". Suis-je capable de faire cela en une seule ligne?


Je suggère d'ouvrir une question séparée pour cela et de simplifier la question pour n'utiliser que le texte bearOneTwoThree .


Je viens de le comprendre. Je devais juste faire $ str = $ str.split ('/') [2] .split ('.') [0] | ForEach-object {$ _ -creplace '. (? = [^ A-z])', '$ &'}



1
votes

Il existe une solution plus simple,
la méthode .split () utilise chaque caractère pour diviser,
en utilisant un index négatif compte de retour, donc

$str = "dog.puppy/cat.kitten/bearOneTwoThree.cub"
$str = $str.split('/.')[-2] -csplit '(?=[A-Z])' -join ' '
$str
bear One Two Three

Votre autre question peut être résolue avec l'opérateur -csplit basé sur RegEx en utilisant un
Lookahead positif sans consommation et
une dernière -join '' pour concaténer les éléments du tableau avec un espace.

> "dog.puppy/cat.kitten/bear.cub".split( '/.')[-2]
bear


1 commentaires

C'est malheureux, mais pour que votre appel .Split () fonctionne également dans PowerShell Core , vous devez utiliser "dog.puppy / cat.kitten / bear. cub ".split ([char []] '/.')[-2] - voir la section inférieure (mise à jour) de stackoverflow.com/a/41905031/45375 pour une explication (et merci pour la récente modification).



4
votes

Suis-je capable d'obtenir "ours" en utilisant une seule ligne en utilisant un passepoil ?

Avec des chaînes déjà stockées en mémoire, il n'y a aucune bonne raison d'utiliser la pipeline - cela ne fera que ralentir les choses. p>

À la place, utilisez les opérateurs de PowerShell, qui sont plus rapides que d'utiliser un pipeline et généralement plus flexibles que strong > les méthodes du type .NET [string] du même nom, car elles fonctionnent sur des expressions régulières strong> (expressions régulières) et peut également fonctionner sur tableaux entiers :

PS> ('dog.puppy/cat.kitten/bearOneTwoThree.cub' -split '[/.]')[-2] -csplit '(?=\p{Lu})'
bear
One
Two
Three

Autrement dit, divisez la chaîne d'entrée par un littéral / ou littéral . (en utilisant un jeu de caractères, [...] ), et renvoie l'avant-dernier (avant-dernier) ( [-2 ] ).

Voir cette réponse pour savoir pourquoi vous devriez généralement préférer le -split opérateur à String.Split () method , par exemple.
Il en va de même pour préférer l'opérateur -replace à Méthode String.Replace () . p >


Il est facile de chaîner ces opérateurs :

PS> ('dog.puppy/cat.kitten/bear.cub' -split '[/.]')[-2]
bear

Autrement dit, renvoyer l'avant-dernier jeton et divisez-le en casse - sensible (en utilisant la variante -csplit de l'opérateur -split ) chaque fois qu'une lettre majuscule ( \ p { Lu} ) démarre, en utilisant une assertion de prospective positive , (? = ... ).


0 commentaires