2017-10-18 4 views
1

Donc, j'ai quelque chose comme ceci:expression régulière pour obtenir des nombres entre

chaîne. (nombres1, nombres2, nombres3) donc quelque chose comme ceci:

bla bla bla. (1234, 5678, 012)

Je voudrais obtenir les premiers chiffres, c'est-à-dire les nombres entre (et, & sans tenir compte de l'espace avant la virgule en même temps dans une regex, puis obtenir le deuxième nombre dans une autre regex sans obtenir le premier si entre le premier « et le second »

J'ai essayé de faire ce qui suit pour obtenir le premier, mais cela ne fonctionne pas même avec l'espace:

^\(\d*,$ 

J'ai même essayé ceci:

^.*?\([^\d]*(\d+)[^\d]*\).*$ 

Et ceci:

\[\((\d+)\).*?\] 

Je le tester ici: https://regex101.com/ et je continue à obtenir aucune correspondance pour une raison quelconque

Je suis en train de le mettre en œuvre en utilisant la langue Go

+1

il est facile avec le langage de programmation – RomanPerekhrest

+0

[ '(?: \ (| \ G *, *) \ K (\ d +) (? = [, \ d] * \)) '] (https://regex101.com/r/HNW0Gf/2)? – ctwheels

+0

Alors, combien de groupes de nombres voulez-vous obtenir, 2? ("1234", "5678", 012) – sln

Répondre

1

Le first regex est

\(\s*(\d+) 

Détails

  • \( - un (
  • \s* - 0+
  • espaces blancs (\d+)
  • - Groupe 1: un ou plusieurs chiffres

Et le second one est

\(\s*\d+\s*,\s*(\d+) 

Comme ci-dessus (avec le groupe de capture retiré à travers le premier motif d'adaptation de chiffres), mais \s*,\s*(\d+) est ajouté:

  • \s*,\s* - un , clos avec 0+ espaces blancs
  • (\d+) - Groupe 1: un ou plusieurs chiffres

Go playground demo:

paquet

principales

import (
    "regexp" 
    "fmt" 
) 

func main() { 
    var str = `bla bla bla . (1234 , 5678 , 012)` 
    var re = regexp.MustCompile(`\(\s*(\d+)`) 

    match := re.FindStringSubmatch(str) 
    fmt.Println(match[1]) 

    var re2 = regexp.MustCompile(`\(\s*\d+\s*,\s*(\d+)`) 
    match2 := re2.FindStringSubmatch(str) 
    fmt.Println(match2[1]) 
} 

Résultats:

1234 
5678 
+0

Merci. Cela a fonctionné parfaitement pour les deux :) – rullzing

+0

Bien sûr. Tu l'as eu :) – rullzing

0

Vous pouvez obtenir tout ce que vous voulez avec une seule regexp et les groupes nommés:

par exemple avec python re module:

import re 

CUSTOM_REGEXP = r".+\.\s{0,}\((?P<first>\d+)\s{0,},\s{0,}(?P<second>\d+)\s{0,},\s{0,}(?P<third>\d+)\)" 
match = re.match(CUSTOM_REGEXP, "bla bla bla.(1234 , 5678 , 012)" 
m.group("first") # 1234 
m.group("second") # 5678 
m.group("third") # 012 

par parties:

.+ un caractère au moins une répétition

\. dot littéral

\s{0,} espace optionnel

\( parenthèse littéral

(?P<first>\d+) groupe d'au moins un entier

, virgule littérale

0

nommé Puisque vous ne spécifiez pas un langage de programmation ou la façon dont vous voulez que votre sortie, il est difficile de donner une réponse précise, mais voici quelques expressions régulières que je pense pourrait Sois ce que tu cherches.

Si l'un de ceux-ci est ce que vous recherchiez c'est à vous de les implémenter sans connaître la langue désirée.

+0

(\ s * (\ d +) \ s *,. *) C'est la seule chose qui a fonctionné. et il a récupéré le 1er groupe correctement. Pourquoi la langue est-elle importante? – rullzing