J'essaie d'extraire une partie d'une chaîne ci-dessous
J'ai essayé (. *) (?: Table) ?, ça échoue dans le dernier cas. Comment faire pour que l'expression capture la chaîne entière en l'absence du texte "table"
- Texte: "diningtable" Correspondance attendue: Dining
- Texte: "cookingtable" Match: cuisine
- Texte: "cuisine" Match: cuisine
- Texte: "table" Correspondance: ""
Réponses:
1 pour la réponse № 1Si vous voulez utiliser regex, vous pouvez utiliser celui-ci:
(^.*)(?=table)|(?!.*table.*)(^.+)
Voir la démo ici: regex101
L'idée est la suivante: faire correspondre tout depuis le début de la ligne ^
jusqu'au mot table
ou si vous ne trouvez pas la table dans la chaîne, faites correspondreau moins un symbole. (pour éviter de faire correspondre les lignes vides). Ainsi, lorsqu'il trouvera la table de mots, il retournera une chaîne vide (car elle correspond au début de la ligne jusqu'à la table de mots).
2 pour la réponse № 2
Plutôt que d'essayer de faire correspondre tout sauf table
, vous devez effectuer une opération de remplacement qui supprime le texte table
.
Selon la langue, il se peut que cela n’ait même pas besoin de regex. Par exemple, en Java, vous pouvez utiliser:
String output = input.replace("table", "");
1 pour la réponse № 3
le (.*)(?:table)?
échoue avec table
(le correspond) comme premier groupe (.*)
est un point gourmand motif correspondant qui saisit la chaîne entière dans le groupe 1. Le moteur regex fait un retour en arrière et cherche table
dans le groupe facultatif non capturant, et correspond à une chaîne vide à la fin de la chaîne.
le regex Le truc est de faire correspondre tout texte qui ne commence pas par table
avant le groupe optionnel:
^((?:(?!table).)+)(?:table)?$
Voir la démo regex
Maintenant, groupe 1 - ((?:(?!table).)+)
- contient un gage gourmand tempéré (?:(?!table).)+
qui correspond à 1 ou plusieurs caractères autres qu'une nouvelle ligne qui ne démarre pas table
séquence. Ainsi, le premier groupe ne correspondra jamais table
.
Les ancres font que la regex correspond à toute la ligne.
REMARQUE: Les solutions autres que les expressions rationnelles pourraient s'avérer plus efficaces, car un jeton gourmand tempéré consomme plutôt des ressources.
NOTE 2: Le déroulement du jeton gourmand tempéré améliore généralement les performances n fois:
^([^t]*(?:t(?!able)[^t]*)*)(?:table)?$
Voir une autre démo
Mais d'habitude, cela a l'air "cryptique", "illisible" et "non maintenable".
1 pour la réponse № 4
Malgré d’autres bonnes réponses, vous pouvez aussi utiliser l’alternance:
^(?|(.*)table$|(.*))$
Cela utilise une réinitialisation de branche, de sorte que votre souhaitéle contenu est toujours stocké dans le groupe 1. Si votre langue / outil de votre choix ne le prend pas en charge, vous devez vérifier lequel des groupes 1 et 2 contient la chaîne.
Voir Démo