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]
3 Réponses :
Vous pouvez faire ceci:
$str = "dog.puppy/cat.kitten/bear.cub".split('/')[2].split('.')[0]
Aucune tuyauterie nécessaire.
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])', '$ &'}
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
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).
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 ThreeAutrement 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
-splitopérateur àString.Split ()method , par exemple.
Il en va de même pour préférer l'opérateur-replaceà MéthodeString.Replace (). p >
Il est facile de chaîner ces opérateurs :
PS> ('dog.puppy/cat.kitten/bear.cub' -split '[/.]')[-2] bearAutrement dit, renvoyer l'avant-dernier jeton et divisez-le en casse - sensible (en utilisant la variante
-csplitde l'opérateur-split) chaque fois qu'une lettre majuscule (\ p { Lu}) démarre, en utilisant une assertion de prospective positive , (? = ... ).