Un regard en arrière négatif de largeur inconnue est pas pris en charge par PCRE (ne .NET, il regarderait like this là-bas), mais vous ne pouvez extraire tous les matches sur chaque ligne avant la première (
ou )
en utilisant une combinaison de \G
et \K
opérateurs l'aide d'une classe de caractères nuls [^()]
qui correspondrait à n'importe quel caractère mais (
et )
.
Vous pouvez utiliser
(?m)(?:^|\G)[^()\n]*?:\h*\K\w+
Voir la regex demo
Détails
(?m)
- mode MULTILINE sur
(?:^|\G)
- début de correspondance d'une chaîne/ligne ou à la fin du match précédent
[^()\n]*?
- tout autre que 0+ caractères (
, )
et retour à la ligne, aussi peu que possible
:
- deux points
\h*
- 0+ horizontales espaces blancs
\K
- Match opérateur de réinitialisation qui élimine tout le texte apparié jusqu'ici
\w+
- 1 ou plusieurs caractères.
Juste pour préciser: vous avez une chaîne multiligne et que vous voulez faire correspondre des mots spécifiques sur les lignes ne contenant pas '(' et ')'? Aussi, voulez-vous vraiment obtenir des correspondances vides, aussi? Je pense que vous avez besoin de '\ w +', pas de \ w * '. –
Si la ligne est ': noprotect; (mot) ', voulez-vous extraire' noprotect'? Les solutions seront différentes pour les cas où une ligne entière ne devrait pas contenir '(' et ')' et quand il n'y aurait pas de '(' et ')' devant un 'mot' sur une ligne. –
Wiktor Stribiżew, merci pour un conseil dans le premier commentaire. Oui, je veux extraire 'noprotect' si la ligne est': noprotect; (mot) ' – skaborik