Comment scinder une chaîne avec plusieurs modèles en perl?
Je veux découper une chaîne avec plusieurs modèles:
ex.
my $string= "10:10:10, 12/1/2011";
my @string = split(/firstpattern/secondpattern/thirdpattern/, $string);
foreach(@string) {
print "$_\n";
}
Je veux avoir une puissance de:
10
10
10
12
1
2011
Quelle est la bonne façon de le faire?
OriginalL'auteur quinekxi | 2011-11-24
Vous devez vous connecter pour publier un commentaire.
Utiliser un classe de personnage dans la regex délimiteur de match sur un ensemble de possibles délimiteurs.
Explication
La paire de barres obliques
/.../
dénote l'expression régulière ou un motif pour être appariés.La paire de crochets
[...]
dénote le caractère de classe de la regex.À l'intérieur est le jeu de caractères possibles qui peuvent être appariés: les deux-points
:
, des virgules,
, n'importe quel type de caractère d'espace\s
, et des barres obliques\/
(avec la barre oblique inverse comme un caractère d'échappement).La
+
est nécessaire pour correspondre à sur 1 ou plus de caractère qui précède, qui est l'ensemble de la classe de personnage dans ce cas. Sans cela, la virgule-espace serait considéré comme de séparer les 2 séparateurs, ce qui vous permet chaîne vide dans le résultat.Merci pour l'apport supplémentaire, qui explique simplement tout! 😀
Je sais que c'est un vieux thread, mais je me demande comment je doit ajouter []() à la liste des délimiteurs? Il semble se débarrasser de l' []() quand je viens de l'ajouter.
Ajouter une barre oblique inverse devant chacun de ceux-ci, tout comme j'ai de la barre ci-dessus
OriginalL'auteur stevenl
Mauvais outil!
Pas besoin de présenter des excuses, vous n'avez rien fait de mal. Une bonne réponse vient habituellement à partir de l'image plus grande. Les Questions sont souvent trop.
Merci bien de me donner quelque chose à penser et envisager une autre solution.
OriginalL'auteur ikegami
Vous pouvez diviser sur la non-chiffres;
OriginalL'auteur Chris Charley
/| |,|:
mieux écrit que[/ ,:]
s'agit-il? IIRC alternances compilé dans un trie en interne, une classe de personnage? Ne dites pas que vous avez tort, vraiment une question.
Je ne connais pas le fonctionnement interne, mais je pense que c'est plus lisible. Voici un indice:
perl -wE "use Benchmark qw(cmpthese); $a=qq(10:10:10, 12/1/2011); cmpthese(100000, { Piped => sub { my @r = split (m[(?:/| |,|:)+], $a); }, Class => sub { my @r = split (m[(?:[/ ,:])+], $a); } });"
Piped 142450/s -- -27% // Class 194175/s 36% --
Ressemble à une classe de personnage est 36% plus rapide.Oups, ne pas voir que le m délimiteur est entre parenthèses. Étrange qu'il n'ai pas à me plaindre. Eh bien, avec
m##
, les résultats d'aller jusqu'à 45% plus rapide.Cette réponse est la plus générale et peut être utilisé avec des mots entiers ainsi
OriginalL'auteur Trizen
Pour répondre à votre question initiale:
vous avez été à la recherche pour le
|
de l'opérateur:Mais, comme l'autre répond point, bien souvent, vous pouvez l'améliorer avec d'autres simplifications ou des généralisations.
Pourquoi êtes-vous reliant à 5.10.0 version de la page, au lieu de la version agnostique perldoc.perl.org/perlre.html#Metacharacters ?
Gilbert: Parce que c'était la première Google m'a donné, et je suis en utilisant 5.10 moi-même, et la portabilité peut être un problème, et je ne le savais pas, il y avait une version indépendante de la version. Merci de fournir le lien.
OriginalL'auteur reinierpost
Si les chiffres sont ce que vous voulez, extraire les numéros:
Capturer les parenthèses ne sont pas nécessaires, comme spécifié dans perlop:
Je ne savais pas que je pouvais utiliser ce type d'approche. Bonne réflexion! Merci beaucoup!
Vous êtes les bienvenus.
split
est un très bel outil, mais qui fonctionne le mieux avec des délimiteurs, je me sens. Dans ce cas, l'élément commun est que les nombres, il est plus facile de travailler avec eux.Oui, en fait j'ai utilisé cette méthode mais je n'ai pas marqué ceci comme la réponse juste pour se conformer à la question d'origine. De toute façon, merci pour votre idée. Je suis heureux que j'ai eu de grandes idées à partir des étrangers vous le souhaitez.
Beaucoup de mes réponses ne sont pas les solutions de l'OPs demandé, mais celui que je pensais qu'ils voulaient vraiment. Votre question était vraiment "Comment puis-je mieux d'extraire les numéros de cette chaîne?" Donc, c'est la réponse que vous avez obtenu. 🙂
OriginalL'auteur TLP
Que vous êtes sur l'analyse de quelque chose qui est plutôt bien évidemment, date/heure, je me demande si il serait plus judicieux d'utiliser DateTime::Format::Strptime à analyser dans un objet DateTime.
OriginalL'auteur Dave Cross