J'ai une liste de plusieurs centaines de chaînes et un tableau de 10k expressions régulières.Swift 3: le moyen le plus performant de vérifier de nombreuses chaînes avec de nombreuses expressions régulières
Je dois maintenant parcourir toutes les chaînes et vérifier laquelle des 10 expressions régulières correspond. Quelle est la manière la plus performante de le faire?
Actuellement, je fais ceci:
myRegularExpression.firstMatch(in: myString, options: myMatchingOption, range: NSMakeRange(0, myString.characters.count)) == nil
où myRegularExpression
est un NSRegularExpression
stocké pour la réutilisation et myMatchingOption
est NSRegularExpression.MatchingOptions(rawValue: 0)
Y at-il un moyen plus rapide, plus performant moyen de vérifier si une chaîne correspond à ces 10k expressions régulières?
EDIT:
Je dois savoir non seulement si l'un de mes 10k expressions régulières en forme, mais aussi que l'on. Donc, actuellement, j'ai une boucle for à l'intérieur d'une boucle for: l'externe itère sur mes centaines de cordes et pour chacune de ces cordes je passe en revue mes règles 10k et voir si une règle convient (bien sûr, je peux arrêter pour cette chaîne, donc à peu près:
for string in stringsToCheck {
for rule in myRules {
if string.matches(rule) {
// continue with next string of stringsToCheck
}
}
}
Pouvez-vous exclure des groupes de chaînes et/ou des registres (c'est-à-dire avez-vous des modèles connus dans vos données?). Le regexrunner est probablement fortement optimisé pour une regex et une chaîne donnée, mais il ne peut pas connaître vos données, par ex. Si vous avez plusieurs registres avec^ou $, vous pouvez grouper toutes les chaînes sur la première ou la dernière lettre et exclure des groupes entiers de chaînes dans une discordance. Aussi, précompiler les régies de possible? –
Avez-vous essayé de construire une méga expression en combinant toutes les expressions régulières en une seule avec | ? Vous ne savez pas si l'analyseur survivra à 10 000 schémas, mais vous pourrez obtenir des améliorations de performances même en les combinant 10 ou 20 à la fois. –
@ LoveTätting merci pour votre réponse, s'il vous plaît voir mon edit ... – swalkner