Java - Meilleure façon de saisir TOUTES les Chaînes de caractères entre deux Chaînes de caractères? (regex?)
Cette question a été mise sur écoute-moi pour un long moment maintenant, mais essentiellement, je suis à la recherche de la façon la plus efficace de saisir toutes les Chaînes de caractères entre deux Chaînes de caractères.
La façon dont je l'ai fait pendant de nombreux mois maintenant est grâce à l'aide d'un tas de temporaire des indices, des cordes, des chaînes, et c'est vraiment salissant. (Pourquoi Java ont pas de méthode native comme String substring(String start, String end)
?
Dire que j'ai une Chaîne de caractères:
abcabc [pattern1]foo[pattern2] abcdefg [pattern1]bar[pattern2] morestuff
L'objectif final serait de sortie foo
et bar
. (Et plus tard à être ajouté dans une JList)
J'ai essayé d'incorporer des regex dans .split()
, mais qui n'ont pas été couronnés de succès. J'ai essayé la syntaxe à l'aide de *
's et .
's, mais je ne pense pas que c'est tout à fait ce que mon intention est surtout depuis .split()
ne prend qu'un seul argument pour split contre.
Sinon je pense qu'un autre moyen est d'utiliser le Pattern et Matcher les classes? Mais je suis vraiment floue sur la procédure à suivre.
- Vous voulez absolument utiliser un
Matcher
pour cela. - C'est assez fort de langue en considérant ce qui est possible dans le code. Voir mon one-liner réponse (qui n'utilise pas de
matcher
!) - Et voir mon commentaire sur votre réponse. Juste parce que vous pouvez utiliser quelque chose ne signifie pas que vous devriez.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez construire la regex de le faire pour vous:
Cela permettra de traiter les
pattern1
etpattern2
comme littérale texte, et le texte entre les modèles est capturé dans la première capture d'un groupe. Vous pouvez supprimerSchéma.quote()
si vous souhaitez utiliser des regex, mais je ne pas garantie de quoi que ce soit si vous n'avez que.Vous pouvez ajouter un peu de personnalisation de la façon dont le match se fait par l'ajout des drapeaux à la
regexString
.(?iu)
au début deregexString
, ou de la fourniture dePattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE
drapeau àSchéma.compiler
méthode.(?s)
avant(.*?)
, c'est à dire"(?s)(.*?)"
, ou de la fourniture deSchéma.DOTALL
drapeau àSchéma.compiler
méthode.Ensuite compiler les regex, obtenir un
Correspondance
objet, itérer sur les matchs et de les enregistrer dans unList
(ou toutCollection
, c'est à vous de voir).Code de test:
Notez que si vous recherchez le texte entre
foo
etbar
dans cette entréefoo text foo text bar text bar
avec la méthode ci-dessus, vous obtiendrez un match, ce qui esttext foo text
.String textInBetween = m.group(1); // Since (.*?) is capturing group 1
devrait probablement êtrematcher.group(1)
mais que d'une petite erreur de frappe et que le code de test qui fonctionne à merveille!(.*?)
à(?s)(.*?)
, ou ajouterPattern.DOTALL
drapeauPattern.compile
.Voici un one-liner qui fait tout:
La répartition est:
.*?
) entre pattern2 et pattern1 (ou à la fin de l'entrée)Arrays.asList()
pour générer unList<String>
Voici un code de test:
De sortie:
(?i)
pour les regexes:List<String> strings = Arrays.asList( input.replaceAll("^.*?(?i)pattern1", "") .split("(?i)pattern2.*?(pattern1|$)"));
Essayez ceci:
Il imprime:
"("+ Pattern.quote(pat1) + ".*?" + Pattern.quote(pat2) + ")"
et la saisir parm.group(1)
.