2010-06-03 4 views
1

Je veux faire correspondre "81" dans "630.81.11". Je suis coincé avec \.[0-9]*\. qui comprend les points.Correspondance "81" dans "630.81.11" en utilisant regex

+3

Quelle langue utilisez-vous? Quel appel de fonction utilisez-vous? –

+0

Son pour une utilisation dans une requête PostGreSQL. J'ai besoin de trier par les trois parties. Quelque chose comme: ORDER BY sous-chaîne (plannr à partir de '^ [0-9] *') :: entier, sous-chaîne (plannr de '\. [0-9] [0-9] \.') :: interger, substring (plannr à partir de '[0-9] * $') :: entier La partie du milieu est le problème - ne peut pas le transformer en entier avec les points. –

Répondre

6

Mise à jour: Après avoir vu ce problème que vous essayez de résoudre, je suggère de ne pas utiliser des expressions régulières.

Son utilisation dans une requête PostGreSQL. J'ai besoin de trier par les trois parties. Quelque chose comme:

ORDER BY 
    substring(plannr from '^[0-9]*')::integer, 
    substring(plannr from '\.[0-9][0-9]\.')::interger, 
    substring(plannr from '[0-9]*$')::integer 

Au lieu d'utiliser une expression régulière, vous pouvez utiliser par exemple split_part:

SELECT plannr 
FROM table1 
ORDER BY 
    split_part(plannr, '.', 1)::integer, 
    split_part(plannr, '.', 2)::integer, 
    split_part(plannr, '.', 3)::integer; 

Résultat:

"2.2.3" 
"2.10.3" 
"2.10.20" 
"10.1.4" 
"630.81.11" 

données de test:

CREATE TABLE table1 (plannr VARCHAR(100) NOT NULL); 
INSERT INTO table1 (plannr) VALUES 
('630.81.11'), 
('2.2.3'), 
('2.10.3'), 
('2.10.20'), 
('10.1.4'); 

réponse originale: Si votre moteur d'expression régulière comprend lookaheads de longueur fixe et assertions arrières vous pouvez le faire:

(?<=\.)[0-9]+(?=\.) 
10
/^[0-9]+\.([0-9]+)\.[0-9]+$/ 
+0

+1: En supposant PCRE, bien sûr. –

2

Vous pouvez joindre la partie intéressante dans un groupe, et extraire plus tard. Donc, quelque chose comme "\. ([0-9] *) \."; les parens dénotent un groupe.

1
Pattern pat = Pattern.compile("\\.(\\d+)\\."); 
String str = "630.81.11"; 
Matcher matcher = pat.matcher(str); 

while (matcher.find()) 
{ 
    System.out.println(matcher.group(1)); 
} 

Je l'ai testé en Java. La sortie est comme suit:

Questions connexes