2017-05-17 4 views
1

J'ai presque l'expression regex complète, mais il y a un cas que je ne suis pas capable de faire correspondre.Capture des groupes optionnels expressions regex Php

Je dois capturer: Le mot xxxx s'il existe, les décimales (30) et le 'cm'.

J'ai des expressions comme:

30x30cm

30 x 30 cm

30x30 cm

xxxx 30x30cm

xxxx (30x30cm) -> Cette affaire ne correspond pas à la mot xxxx (si existant je dois capturer)

xxxx (30 x 30 cm) -> Cette affaire ne correspond pas au mot xxxx (si elles existent que je dois capturer)

Thats my regex aujourd'hui:

(?:(\w+))?\s?\b(\d+)\s?x\s?(\d+)\s?(cm)\b 

Comment puis-je correspondre avec le mot xxxx si existe? Toute aide serait appréciée

[https://regex101.com/r/morihH/1][1]

Répondre

1

Vous pouvez ajouter en option des espaces blancs et un ( au premier option groupe non-capture:

(?:(\w+)\s*\(?)?\b(\d+)\s?x\s?(\d+)\s?(cm)\b 
     ^^^^^^ 

Voir la regex demo (\s remplacé par un espace depuis le chaîne d'entrée est une chaîne multiligne).

Les \s*\(? correspondent aux espaces 0+ suivis d'un ( optionnel.

+1

Merci Wiktor. Fonctionne comme un charme. Salutations – Albeis

+0

Et si je veux faire correspondre 30,13 x 30,12 cm? Les mesures avec des décimales? – Albeis

+1

@Albeis: [. \ D,] Puisque vous * extrayez * valeurs, je remplacerais '\ d +' 'avec \' d * (un chiffre suivi avec 0+ chiffres, des points ou des virgules). Voir [cette mise à jour de la démo regex] (https://regex101.com/r/OFZEXm/2). –