RegEx для соответствия 123,45 и E123,4 и V12,34 - PullRequest
1 голос
/ 06 августа 2009

Я пытаюсь создать RegEx, который соответствует 3 шаблонам, перечисленным выше. Я могу в некоторой степени создать работающий RegEx для любого из этих трех, но моя проблема заключается в создании такого, который работает со всеми четырьмя из них. Ниже приведены допустимые значения, где D - любая цифра, а «.» никогда не присутствует в качестве завершающего символа (то есть DDD. не будет действительным). Также V и E относятся к этим конкретным символам.

  • ддд
  • ddd.d
  • ddd.dd
  • Vdd
  • Vdd.d
  • Vdd.dd
  • Eddd
  • Eddd.d

Все остальное должно быть недействительным, например:

  • д
  • V
  • Vd
  • Vdd. (трейлинг '.')
  • E
  • Эд
  • Edd

Я не очень хорош с RegEx, но я мог бы описать часть этого шаблона для записей, начинающихся с V, следующим образом:

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

Я мог бы написать очень похожие операторы для всей части цифр и префикса E для записей. Проблема в том, как объединить все 3 в RegEx, который не заставляет мою голову вращаться, чтобы читать. Что такое хороший RegEx для соответствия всем 3 моделям?

РЕДАКТИРОВАТЬ: я забыл включить формат Vdd.dd

Ответы [ 4 ]

1 голос
/ 06 августа 2009

Если бы Эддд был недействительным, это было бы намного проще:

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

Аналогично, если Vddd был действителен:

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

Совпадение с тем, что у вас есть, немного сложнее:

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

Убедитесь, что вы проверяете на точное соответствие, в противном случае такие вещи, как

V123.1

Будет соответствовать как

V12
1 голос
/ 06 августа 2009
(\d{3}(\.\d{1,2})?)|(V\d{2}(\.\d{1,2})?)|(E\d{3}(\.\d)?)

РЕДАКТИРОВАТЬ: Некоторое объяснение: я просто сопоставил все 3 различных формата:

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

говорит, что три цифры необязательно сопровождаются периодом, совпадающим с 1 или 2 цифрами.

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

говорит, что V сопровождается двумя цифрами с необязательным периодом и одной или двумя цифрами

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

говорит, что три цифры сопровождаются дополнительным периодом с одной цифрой

Тогда я просто окружил каждого с помощью () и объединил их всех с | (Или). * * +1013

1 голос
/ 06 августа 2009

Ничего плохого в том, чтобы иметь три разных регулярных выражения, не так ли?

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

И, вероятно, в будущем это будет более приемлемым.

1 голос
/ 06 августа 2009
(E\d|(V|\d))\d{2,2}(\.\d)?(?(2)\d?|)

E с одной цифрой, или V, или одной цифрой, за которой следуют две цифры, затем обычные десятичные числа.

E должно иметь три недесятичных цифры, V должно иметь 2, а цифры сами по себе должны иметь три.

Если V или однозначное совпадение в начале (т. Е. Не 'E'), то дополнительная цифра допускается сзади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...