2015-06-11 14 views
8

ich eine solche Regex haben:Begrenzen Sie die Anzahl der Stellen in regex

'(?:\$|сум)(\040)?(\d+)|(\d+)(\040)?(?:\$|сум)' 

Es passt folgende Zeichenketten:

$23 
23$ 
1000сум 
сум1000 
сум 1000 
1000 сум 

Ich möchte die Anzahl der Stellen in diesem regex bis 8 begrenzen.

dies versucht:

'(?:\$|сум)(\040)?(\d{, 8})|(\d{, 8})(\040)?(?:\$|сум)' 

Es hat aufgehört, irgendetwas zu entsprechen.

Was mache ich falsch?

+0

eine Abkürzung Haben Sie versucht, '\ d {0,8} '? –

+0

@tobias_k ja ich tat. [Link zum Herausgeber] (http://pythex.org/?regex= (% 3F% 3A% 5C% 24% 7C% D1% 81% D1% 83% D0% BC) (% 5C040)% 3F (% 5Cd % 7B% 2C% 208% 7D)% 7C (% 5Cd% 7B0% 2C% 208% 7D) (% 5C040)% 3F (% 3F% 3A% 5C% 24% 7C% D1% 81% D1% 83% D0 % BC) & test_string = 15000% D1% 81% D1% 83% D0% BC & ignorieren = 0 & multiline = 0 & dotall = 0 & verbose = 0) –

Antwort

5
\d{, 8} 

bedeutet nichts .Engine es buchstäblich übereinstimmen und so Ihre regex fehlgeschlagen.

Verwenden

\d{0,8} 

Keine Leerzeichen innerhalb {}

+0

Vielen Dank für Ihre Antwort. Ich habe irgendwo gelesen, dass sogar {, 8} möglich war, das Maximum zu setzen. Eigentlich habe ich sogar versucht {1, 8}. Mein Problem war in einem Leerzeichen in '{}'. Danke :) –

3

Versuchen Sie, die untere Grenze wie (\d{0,8}) anzugeben.

Neben einigen Regex-Dialekten erlauben keine Leerzeichen nach Komma in {0,8} Konstruktion.

+0

Hat nicht geholfen. Bitte beachten Sie [dies] (http://pythex.org/?regex= (% 3F% 3A% 5C% 24% 7C% D1% 81% D1% 83% D0% BC) (% 5C040)% 3F (% 5Cd % 7B% 2C% 208% 7D)% 7C (% 5Cd% 7B0% 2C% 208% 7D) (% 5C040)% 3F (% 3F% 3A% 5C% 24% 7C% D1% 81% D1% 83% D0 % BC) & test_string = 15000% D1% 81% D1% 83% D0% BC & ignorecase = 0 & mehrzeilig = 0 & dotall = 0 & verbose = 0) –

+0

Es half nicht wegen Leerraum nach Komma. –

+0

Ja, Whitespace war mein echtes Problem. Danke –

1

Sie müssen auch eine untere Grenze festlegen.

(?:\$|сум)(\040)?(\d{0,8})|(\d{0,8})(\040)?(?:\$|сум) 

können Sie sehen eine demo here

4

Werfen Sie einen Blick auf das, was regex101.com sagt:

enter image description here

Sie können das {1,8} Begrenzung quantifier, die 1 bis 8 Ziffern übereinstimmen. Ich sehe, es muss mindestens 1 sein, da Sie + in Ihrem ursprünglichen Regex haben.

^(?:(?:\$|сум)(\040)?(\d{1,8})|(\d{1,8})(\040)?(?:\$|сум))$ 

Siehe demo

Vom regular-expressions.info:

Die Syntax ist {min,max}, wo min Null ist oder eine positive ganze Zahl Zahl, die die minimale Anzahl von Übereinstimmungen angibt, und max eine ganze Zahl gleich oder größer als min, die die maximale Anzahl der Übereinstimmungen angibt. Wenn das Komma vorhanden ist, aber max weggelassen wird, ist die maximale Anzahl der Übereinstimmungen unendlich. So ist {0,1} das gleiche wie ?, {0,} ist das gleiche wie *, und {1,} ist das gleiche wie +. Wenn Sie sowohl das Komma als auch das Maximum weglassen, teilt die Engine dem Token exakt min mal mit.

1

Geben Sie auch die untere Grenze

(?:\$|сум)(\040)?(\d{1,8})|(\d{1,8})(\040)?(?:\$|сум)

Dies funktionieren würde.

+0

Ja, habe vergessen, diese zu entfernen. Fertig, danke – Vaulstein

5

Die {} hat drei Form:

  • {N} für eine festgelegte Anzahl von Zeit
  • {M,} mindestens M-mal
  • {N,M} für zwischen N und M mal.

Wenn Sie die letzte verwenden, ist das Minimum obligatorisch.

zu \d{1,8} Ändern Sie Ihre regex zwischen 1 und 8 mal eine Ziffer

Beginnend mit 1 entsprechen, wie Sie mit + wurden die für {1,}

+0

Ich las irgendwo, dass sogar {, 8} möglich war, das Maximum einzustellen. Eigentlich habe ich sogar versucht {1, 8}. Mein echtes Problem war das Leerzeichen. Vielen Dank für Ihre Antwort :) –

+0

In der Tat habe ich vergessen, über den Whitespace zu sprechen, aber als @vks bereits angegeben, ich habe nicht aktualisiert :) Nur meine Antwort für die 1 am Anfang, wie Sie mit + – Tensibai

Verwandte Themen