Каков regex шаблон для даты и времени (01.09.2008 12:35:45)?

PECS (сокращение от «Производитель extends и Consumer super») объясняется: принципом «Get and Put»

«Get And Put» (из Java Generics and Collections)

Указывает, что

  1. использует расширенный подстановочный знак, когда вы получаете только значения из структуры
  2. , используя суперсимвол, когда вы добавляете значения только в структуру
  3. и не использовать подстановочный знак, когда вы оба получаете и ставите.

Давайте рассмотрим его на примере:

1. For Extends Wildcard (получить значения, т. Е. Producer extends)

Вот метод, который берет набор чисел, преобразует каждый в double и суммирует их вверх

public static double sum(Collection<? extends Number> nums) {
   double s = 0.0;
   for (Number num : nums) 
      s += num.doubleValue();
   return s;
}

Назовем метод:

List<Integer>ints = Arrays.asList(1,2,3);
assert sum(ints) == 6.0;
List<Double>doubles = Arrays.asList(2.78,3.14);
assert sum(doubles) == 5.92;
List<Number>nums = Arrays.<Number>asList(1,2,2.78,3.14);
assert sum(nums) == 8.92;

Поскольку метод sum() использует extends, все следующие вызовы являются законными. Первые два вызова не были бы законными, если бы расширения не использовались.

ИСКЛЮЧЕНИЕ : вы не можете помещать что-либо в тип, объявленный с помощью подстановочного знака extends, за исключением значения null, который относится к каждому ссылочному типу:

List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
List<? extends Number> nums = ints;
nums.add(null);  // ok
assert nums.toString().equals("[1, 2, null]");

2. Для Super Wildcard (put values ​​ie Consumer super)

Вот метод, который принимает набор чисел и int n, и помещает первые n целые числа, начиная с нуля, в сбор:

public static void count(Collection<? super Integer> ints, int n) {
    for (int i = 0; i < n; i++) ints.add(i);
}

Давайте назовем метод:

List<Integer>ints = new ArrayList<Integer>();
count(ints, 5);
assert ints.toString().equals("[0, 1, 2, 3, 4]");
List<Number>nums = new ArrayList<Number>();
count(nums, 5); nums.add(5.0);
assert nums.toString().equals("[0, 1, 2, 3, 4, 5.0]");
List<Object>objs = new ArrayList<Object>();
count(objs, 5); objs.add("five");
assert objs.toString().equals("[0, 1, 2, 3, 4, five]");

Поскольку метод count() использует super, все следующие звонки законны: последние два вызова не были бы законными, если бы супер не использовался.

ИСКЛЮЧЕНИЕ : вы не можете получить что-либо из типа, объявленного с помощью super за исключением значения типа Object, которое является супертипом каждого ссылочного типа:

List<Object> objs = Arrays.<Object>asList(1,"two");
List<? super Integer> ints = objs;
String str = "";
for (Object obj : ints) str += obj.toString();
assert str.equals("1two");

3. Когда оба Get и Put, не используйте wildcard

. Когда вы оба вставляете значения и получаете значения из одной и той же структуры, вы не должны использовать подстановочный знак.

public static double sumCount(Collection<Number> nums, int n) {
   count(nums, n);
   return sum(nums);
}
46
задан abatishchev 27 April 2012 в 06:41
поделиться

4 ответа

@Espo: Я просто должен сказать, что regex невероятен. Я не хотел бы должным быть записать код, который сделал что-то полезное с соответствиями, такой, как будто Вы хотели на самом деле узнать, какую дату и время пользователь ввел.

кажется, что решение Tom было бы более надежным, поскольку это приблизительно в огромное количество раз более просто, и с добавлением некоторых круглых скобок можно легко достигнуть значения, которые ввел пользователь:

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

при использовании жемчуга, тогда можно вывести значения с чем-то вроде этого:

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

Другие языки будут иметь подобную возможность. Обратите внимание, что необходимо будет сделать некоторые незначительные модификации к regex, если Вы захотите принять значения, такие как одноразрядные месяцы.

58
ответ дан Greg Hewgill 26 November 2019 в 20:23
поделиться

Простая версия, которая будет работать на упомянутый формат, но не все другие согласно @Espos:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 
22
ответ дан Tom 26 November 2019 в 20:23
поделиться

http://regexlib.com/REDetails.aspx?regexp_id=610

^ (? =\d) (?: (?:31 (?!. (?:0? [2469] |11)) | (?:30|29) (?!.0? 2) |29 (? =.0? 2. (?: (?: (?:1 [6-9] | [2-9] \d)? (?:0 [48] | [2468] [048] | [13579] [26]) | (?: (?:16 | [2468] [048] | [3579] [26]) 00))) (? $:\x20|)) | (?:2 [0-8] |1\d|0? [1-9])) ([-./]) (?:1 [012] |0? [1-9]) \1 (?:1 [6-9] | [2-9] \d)? \d\d (?: (? = \x20\d) \x20| $))? (((0? [1-9] |1 [012]) (: [0-5] \d) {0,2} (\x20[AP] M)) | ([01] \d|2 [0-3]) (: [0-5] \d) {1,2})? $

<час>

Это РЕ проверяет и даты и шаблоны времен. Дни в феврале также проверены в течение многих Високосных годов. Даты: в dd/mm/yyyy или d/m/yy форматируют между 01.01.1600 - 31.12.9999. Продвижение обнуляет, являются дополнительными. Разделители даты могут или соответствовать тире (-), наклонные черты (/) или времена периодов (.): в hh:MM:ss/PM 12-часовой формат (12:00 - 23:59:59) или hh:MM:ss военный формат времени (0:00:00 - 23:59:59). 12-часовой формат времени: 1) может иметь начальный нуль в течение часа. 2) Минуты и секунды являются дополнительными для 12-часового формата 3), AM или PM требуются и чувствительны к регистру. Военное время 1) должно иметь начальный нуль в течение всех часов меньше чем 10. 2) Минуты являются manditory. 3) секунды являются дополнительными. Datetimes: комбинация вышеупомянутых форматов. Дата сначала тогда время, разделенное пространством. исключая) <час> dd/mm/yyyy hh:MM:ss

Редактирование : Удостоверьтесь, что Вы копируете RegEx с веб-сайта regexlib.com, поскольку StackOverflow иногда удаляет/уничтожает специальные символы.

7
ответ дан Espo 26 November 2019 в 20:23
поделиться

PHP preg функции нужен Ваш regex, который будет обернут с символом-разделителем, который может быть любым символом. Вы не можете использовать этот символ-разделитель, не выходя в regex. Это должно работать (здесь, символ-разделитель/):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

, Если необходимо соответствовать строкам, которые содержат только дату и время, добавьте ^ и $ вначале и конец regex.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

Ссылка на preg_match Руководства PHP ()

-1
ответ дан Imran 26 November 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: