2009-08-06 10 views
1

Ich versuche, eine RegEx zu erstellen, die die 3 oben aufgeführten Muster entspricht. Ich kann ein funktionierendes RegEx für irgendeine von diesen 3 etwas schaffen, aber mein Problem ist, eine zu schaffen, die mit allen 4 von denen arbeitet. Die erlaubten Werte sind unten, wobei D eine Ziffer und das '.' ist niemals als ein abschließendes Zeichen vorhanden (d. h. DDD wäre nicht gültig). Auch V und E beziehen sich auf diese spezifischen Zeichen.RegEx entspricht 123.45 und E123.4 und V12.34

  • ddd
  • ddd.d
  • DDD.DD
  • Vdd
  • Vdd.d
  • Vdd.dd
  • Eddd
  • Eddd.d

Jeder

  • d
  • dd
  • V
  • Vd
  • Vdd: was sonst sollte als ungültig sein, so. (Nachlauf '')
  • E
  • Ed
  • Edd

Ich bin nicht gut mit RegEx, aber ich könnte ein Teil dieses Musters für die Einträge beschreiben, die mit V beginnen, wie die folgenden :

V[0-9]{2,2}(\.[0-9]{1,2})? 

Ich könnte sehr ähnliche Aussagen für den ganzzahligen Teil von Ganzzahl und E Präfixteil von Einträgen schreiben. Das Problem ist, wie man alle 3 in eine RegEx kombiniert, die meinen Kopf nicht zum Lesen drehen lässt. Was ist eine gute RegEx, um alle 3 Muster zu treffen?

EDIT: Ich habe das Format Vdd.dd

+0

Was Eddd.dd Vorstellungen? – Grant

Antwort

1
(\d{3}(\.\d{1,2})?)|(V\d{2}(\.\d{1,2})?)|(E\d{3}(\.\d)?) 

EDIT: Eine Erklärung: Ich habe alle 3 verschiedene Formate angepasst:

\d{3}(\.\d{1,2})? 

sagt drei Ziffern optional gefolgt von einem Punkt mit 1 oder 2 Stellen abgestimmt.

V\d{2}(\.\d{1,2})? 

sagt V durch zwei Ziffern mit optionaler Zeit und einem oder zwei Ziffern gefolgt

E\d{3}(\.\d)? 

sagt drei Ziffern durch eine optionale Zeit mit einem einstelligen

Dann einfach umgeben folgte ich jeden mit() und kombinierte sie alle mit | (oder).

+0

setzen Sie vier Leerzeichen auf die Zeile mit dem Backslash, um es als Code statt MarkDown zu behandeln –

+0

das sieht sehr nah an das, was ich brauche - ich habe vergessen, Vdd.dd einzuschließen, wie ich im bearbeiteten Beitrag erwähne, aber sonst sieht das gut aus! –

+0

Sollte jetzt für diesen Fall behoben sein. – jcb

1
(E\d|(V|\d))\d{2,2}(\.\d)?(?(2)\d?|) 

E mit einer Ziffer oder V oder eine einzelne Ziffer, gefolgt von zwei Ziffern enthalten, dann die übliche dezimal Zeug.

E muss drei nicht-dezimale Ziffern haben, V muss 2 haben, und Ziffern von ihnen selbst müssen drei haben.

Wenn das V oder die einzelne Ziffer beim Start übereinstimmen (I.E. Nicht 'E'), ist eine zusätzliche Ziffer auf der Rückseite zulässig.

+0

E und V kann nur um 1 Stelle nach dem Komma folgen (zumindest scheint es so aus der Post). Dies ermöglicht Eddd.dd – jcb

+0

Fixed it. Jetzt ist Eddd.d nicht erlaubt. – Grant

1

Nichts ist falsch mit drei verschiedenen regulären Ausdrücken, oder?

\d{3}(.\d{1,2)? 
V\d{2}(.\d)? 
E\d{3}(.\d)? 

Und dies wird in Zukunft wahrscheinlich wartungsfreundlicher sein.

+0

Ich benutze die Regex für das Maskenfeld von devexpress Silverlight Controls Toolkit, es akzeptiert nur eine einzige Zeichenfolge. aber ja, sonst würde ich sie gerne getrennt halten. –

1

Wenn Eddd ungültig wäre, es wäre viel einfacher:

[EV\d]\d{2}(\.\d{0,2})? 

Ebenso, wenn vddd gültig war:

[EV\d]\d{2,3}(\.\d{0,2})? 

Passende genau das, was Sie haben ein bisschen schwieriger ist:

(\d{3}(\.\d{1,2})?)|(V\d{2}(\.\d)?)|(E\d{3}(\.\d)?) 

Stellen Sie sicher, dass Sie auf genaue Übereinstimmung andere Dinge wie

testen
V123.1 

Wird als

V12 
+0

Vielen Dank für die Erklärung, es ist sehr hilfreich. Ja, wenn diese seltsamen Fälle nicht existierten, wäre mein Leben ein bisschen einfacher;) –

+0

Musste etwas für meinen zusätzlichen Fall bearbeiten, den ich vergaß, aber dieser funktioniert völlig. ty. (\ d {3} (\. \ d {1,2})?) | (V \ d {2} (\. \ d {1,2})?) | (E \ d {3} (\ . \ d)?) –