Je suis nouveau dans les expressions régulières et j'apprécierais votre aide. J'essaie de créer une expression qui divisera la chaîne d'exemple en utilisant tous les espaces qui ne sont pas entourés de guillemets simples ou doubles. Ma dernière tentative ressemble à ceci: (?!")
et ne fonctionne pas tout à fait. Il se partage sur l'espace avant le devis.
Exemple d'entrée:
This is a string that "will be" highlighted when your 'regular expression' matches something.
Sortie désirée:
This
is
a
string
that
will be
highlighted
when
your
regular expression
matches
something.
Notez cela "will be"
et 'regular expression'
conservez l'espace entre les mots.
Réponses:
Je ne comprends pas pourquoi tous les autres proposent des expressions régulières aussi complexes ou un code aussi long. Essentiellement, vous voulez récupérer deux types de choses de votre chaîne: des séquences de caractères qui ne sont pas des espaces ou des guillemets, et des séquences de caractères qui commencent et se terminent par des guillemets, sans guillemets entre les deux, pour deux types de guillemets. Vous pouvez facilement faire correspondre ces choses avec cette expression régulière:
J'ai ajouté les groupes de capture parce que vous ne voulez pas les citations dans la liste.
Ce code Java construit la liste, en ajoutant le groupe de capture s'il correspond pour exclure les guillemets, et en ajoutant la correspondance globale de regex si le groupe de capture ne correspond pas (un mot sans guillemets correspond).
Si cela ne vous dérange pas d'avoir les guillemets dans la liste renvoyée, vous pouvez utiliser un code beaucoup plus simple:
la source
\"
?John's mother
résultats sont divisés en[John, s, mother]
"([^"]*)"|'([^']*)'|[^\s]+
."([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|[^\s]+
. Voir stackoverflow.com/questions/5695240/…Il existe plusieurs questions sur StackOverflow qui couvrent cette même question dans divers contextes à l'aide d'expressions régulières. Par exemple:
MISE À JOUR : Exemple de regex pour gérer les chaînes entre guillemets simples et doubles. Réf: Comment puis-je diviser sur une chaîne sauf entre guillemets?
J'ai testé cela avec un extrait de code Perl rapide et la sortie était comme reproduite ci-dessous. Fonctionne également pour les chaînes vides ou les chaînes d'espaces uniquement si elles sont entre guillemets (je ne sais pas si c'est souhaité ou non).
Notez que cela inclut les caractères de guillemet eux-mêmes dans les valeurs correspondantes, bien que vous puissiez les supprimer avec une chaîne de remplacement ou modifier l'expression régulière pour ne pas les inclure. Je vais laisser cela comme un exercice pour le lecteur ou une autre affiche pour le moment, car 2h du matin est bien trop tard pour jouer avec les expressions régulières;)
la source
Si vous souhaitez autoriser les guillemets échappés à l'intérieur de la chaîne, vous pouvez utiliser quelque chose comme ceci:
Les chaînes citées seront du groupe 2, les mots simples sans guillemets seront le groupe 3.
Vous pouvez l'essayer sur différentes chaînes ici: http://www.fileformat.info/tool/regex.htm ou http://gskinner.com/RegExr/
la source
Le regex de Jan Goyvaerts est la meilleure solution que j'ai trouvée jusqu'à présent, mais crée également des correspondances vides (nulles), qu'il exclut dans son programme. Ces correspondances vides apparaissent également à partir des testeurs de regex (par exemple rubular.com). Si vous inversez les recherches (recherchez d'abord les parties citées et les mots séparés par des espaces), vous pouvez le faire une fois avec:
la source
Cela correspondra aux espaces non entourés de guillemets doubles. Je dois utiliser min, max {0,99999} car Java ne prend pas en charge * et + dans lookbehind.
la source
Il sera probablement plus facile de rechercher la chaîne, de saisir chaque partie, plutôt que de la diviser.
La raison étant, vous pouvez le diviser aux espaces avant et après
"will be"
. Mais, je ne peux penser à aucun moyen de spécifier en ignorant l'espace entre à l'intérieur d'une scission.(pas Java réel)
En outre, la capture de guillemets simples peut entraîner des problèmes:
la source
String.split()
n'est pas utile ici car il n'y a aucun moyen de faire la distinction entre les espaces entre guillemets (ne pas diviser) et ceux à l'extérieur (diviser).Matcher.lookingAt()
est probablement ce dont vous avez besoin:qui produit la sortie suivante:
la source
J'ai aimé l'approche de Marcus, cependant, je l'ai modifiée pour que je puisse autoriser le texte près des guillemets et prendre en charge les caractères "et 'quote". Par exemple, j'avais besoin d'un = "une valeur" pour ne pas le diviser en [a =, " une certaine valeur "].
la source
L'approche de Jan est excellente, mais en voici une autre pour mémoire.
Si vous vouliez réellement diviser comme mentionné dans le titre, en gardant les guillemets entre
"will be"
et'regular expression'
, alors vous pouvez utiliser cette méthode qui est tout droit sortie de Match (ou remplacer) un modèle sauf dans les situations s1, s2, s3 etc.Le regex:
Les deux alternances de gauche correspondent complètes
'quoted strings'
et"double-quoted strings"
. Nous ignorerons ces correspondances. Le côté droit correspond et capture les espaces du groupe 1, et nous savons que ce sont les bons espaces car ils ne correspondent pas aux expressions de gauche. Nous les remplaçons parSplitHere
puis divisésSplitHere
. Encore une fois, c'est pour un vrai cas partagé où vous voulez"will be"
, nonwill be
.Voici une implémentation fonctionnelle complète (voir les résultats sur la démo en ligne ).
la source
Si vous utilisez c #, vous pouvez utiliser
J'ai spécifiquement ajouté " | <(? [\ W \ s] *)> " pour souligner que vous pouvez spécifier n'importe quel caractère pour regrouper des phrases. (Dans ce cas, j'utilise <> pour grouper.
La sortie est:
la source
Je suis raisonnablement certain que ce n'est pas possible en utilisant uniquement des expressions régulières. Vérifier si quelque chose est contenu dans une autre balise est une opération d'analyse. Cela semble être le même problème que d'essayer d'analyser XML avec une regex - cela ne peut pas être fait correctement. Vous pourrez peut-être obtenir le résultat souhaité en appliquant à plusieurs reprises une expression régulière non gourmande et non globale qui correspond aux chaînes entre guillemets, puis une fois que vous ne trouvez rien d'autre, divisez-la au niveau des espaces ... qui a un certain nombre de problèmes, y compris le suivi de l'ordre d'origine de toutes les sous-chaînes. Votre meilleur pari est d'écrire simplement une fonction très simple qui itère sur la chaîne et extrait les jetons que vous voulez.
la source
Nous espérons que quelques ajustements utiles sur la réponse acceptée de Jan:
la source
you're
Vous pouvez également essayer ceci:
la source
Ce qui suit renvoie un tableau d'arguments. Les arguments sont la variable «commande» divisée en espaces, sauf si elle est incluse entre guillemets simples ou doubles. Les correspondances sont ensuite modifiées pour supprimer les guillemets simples et doubles.
la source
1er one-liner utilisant String.split ()
[This, is, a, string, that, "will be", highlighted, when, your, 'regular expression', matches, something.]
ne pas diviser au blanc, si le blanc est entouré de guillemets simples ou doubles,
diviser le blanc lorsque les 255 caractères à gauche et tous les caractères à droite du blanc ne sont ni des guillemets simples ni des guillemets doubles
adapté de l'article original (ne gère que les guillemets doubles)
la source