/ / Extraire une partie d'une chaîne en utilisant regex - regex

Extraire une partie d'une chaîne en utilisant regex - regex

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"

  1. Texte: "diningtable" Correspondance attendue: Dining
  2. Texte: "cookingtable" Match: cuisine
  3. Texte: "cuisine" Match: cuisine
  4. Texte: "table" Correspondance: ""

Réponses:

1 pour la réponse № 1

Si 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.

entrer la description de l'image ici

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