Попытка разбить регулярное выражение на несколько строк в машинописном тексте [duplicate]

strtotime будет работать так. даты не совпадают и все в формате usb.

<?php
$e1 = strtotime("2013-07-22T12:00:03Z");
echo date('y.m.d H:i', $e1);
echo "2013-07-22T12:00:03Z";

$e2 = strtotime("2013-07-23T18:18:15Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-23T18:18:15Z";

$e1 = strtotime("2013-07-21T23:57:04Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-21T23:57:04Z";
?>
98
задан Nik Sumeiko 7 September 2012 в 12:17
поделиться

6 ответов

Вы можете преобразовать его в строку и создать выражение, вызвав new RegExp():

var myRE = new RegExp (['^(([^<>()[\]\\.,;:\\s@\"]+(\\.[^<>(),[\]\\.,;:\\s@\"]+)*)',
                        '|(\\".+\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.',
                        '[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\\.)+',
                        '[a-zA-Z]{2,}))$'].join(''));

Примечания:

  1. при преобразовании литерала выражения на строку, необходимую для удаления всех обратных косых черт, когда обратная косая черта потребляется при оценке строкового литерала . (См. Комментарий Kayo для более подробной информации.)
  2. RegExp принимает модификаторы в качестве второго параметра /regex/g => new RegExp('regex', 'g')

[Дополнение ES20xx (тегированный шаблон )]

В ES20xx вы можете использовать тегированные шаблоны . См. Фрагмент.

Примечание:

  • Недостаток заключается в том, что вы не можете использовать простые пробелы в строке регулярного выражения (всегда используйте \s, \s+, \s{1,x}, \t, \n и т. д.).

(() => {
  const createRegExp = (str, opts) => 
    new RegExp(str.raw[0].replace(/\s/gm, ""), opts || "");
  const yourRE = createRegExp`
    ^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|
    (\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|
    (([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$`;
  console.log(yourRE);
  const anotherLongRE = createRegExp`
    (\byyyy\b)|(\bm\b)|(\bd\b)|(\bh\b)|(\bmi\b)|(\bs\b)|(\bms\b)|
    (\bwd\b)|(\bmm\b)|(\bdd\b)|(\bhh\b)|(\bMI\b)|(\bS\b)|(\bMS\b)|
    (\bM\b)|(\bMM\b)|(\bdow\b)|(\bDOW\b)
    ${"gi"}`;
  console.log(anotherLongRE);
})();

88
ответ дан KooiInc 28 August 2018 в 07:25
поделиться

Чтобы избежать массива join, вы также можете использовать следующий синтаксис:

var pattern = new RegExp('^(([^<>()[\]\\.,;:\s@\"]+' +
  '(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@' +
  '((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|' +
  '(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$');
0
ответ дан andreasonny83 28 August 2018 в 07:25
поделиться

В приведенном выше выражении отсутствуют черные черты, которые не работают должным образом. Итак, я редактировал регулярное выражение. Пожалуйста, рассмотрите это регулярное выражение, которое работает 99.99% для проверки подлинности электронной почты.

let EMAIL_REGEXP = 
new RegExp (['^(([^<>()[\\]\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\.,;:\\s@\"]+)*)',
                    '|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.',
                    '[0-9]{1,3}\])|(([a-zA-Z\\-0-9]+\\.)+',
                    '[a-zA-Z]{2,}))$'].join(''));
4
ответ дан Anvesh Reddy 28 August 2018 в 07:25
поделиться

Лично я перешел к менее сложному регулярному выражению:

/\S+@\S+\.\S+/

Конечно, он меньше точный , чем ваш текущий шаблон, но что вы пытаетесь выполнить ? Вы пытаетесь поймать случайные ошибки, которые могут возникнуть у ваших пользователей, или вы обеспокоены тем, что ваши пользователи могут пытаться ввести неверные адреса? Если это первый, я бы выбрал более простой шаблон. Если это последний, некоторые проверки, отвечая на электронную почту, отправленную на этот адрес, могут быть лучшим вариантом.

Однако, если вы хотите использовать свой текущий шаблон, было бы (IMO) проще прочитайте (и поддержите!), построив его из более мелких суб-паттернов, например:

var box1 = "([^<>()[\]\\\\.,;:\s@\"]+(\\.[^<>()[\\]\\\\.,;:\s@\"]+)*)";
var box2 = "(\".+\")";

var host1 = "(\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])";
var host2 = "(([a-zA-Z\-0-9]+\\.)+[a-zA-Z]{2,})";

var regex = new RegExp("^(" + box1 + "|" + box2 + ")@(" + host1 + "|" + host2 + ")$");
3
ответ дан Bart Kiers 28 August 2018 в 07:25
поделиться

Расширение ответа @KooiInc позволяет избежать автоматического экранирования каждого специального символа с помощью свойства source объекта RegExp.

Пример:

var urlRegex= new RegExp(''
  + /(?:(?:(https?|ftp):)?\/\/)/.source     // protocol
  + /(?:([^:\n\r]+):([^@\n\r]+)@)?/.source  // user:pass
  + /(?:(?:www\.)?([^\/\n\r]+))/.source     // domain
  + /(\/[^?\n\r]+)?/.source                 // request
  + /(\?[^#\n\r]*)?/.source                 // query
  + /(#?[^\n\r]*)?/.source                  // anchor
);

или если вы хотите избежать повторения свойства .source, вы можете сделать это с помощью функции Array.map():

var urlRegex= new RegExp([
  /(?:(?:(https?|ftp):)?\/\/)/      // protocol
  ,/(?:([^:\n\r]+):([^@\n\r]+)@)?/  // user:pass
  ,/(?:(?:www\.)?([^\/\n\r]+))/     // domain
  ,/(\/[^?\n\r]+)?/                 // request
  ,/(\?[^#\n\r]*)?/                 // query
  ,/(#?[^\n\r]*)?/                  // anchor
].map(function(r) {return r.source}).join(''));

В ES6 функция отображения может быть сведена к: .map(r => r.source)

73
ответ дан korun 28 August 2018 в 07:25
поделиться

Использование строк в new RegExp неудобно, потому что вы должны избегать всех обратных косых черт. Вы можете писать меньшие регулярные выражения и конкатенировать их.

Давайте разделим это регулярное выражение

/^foo(.*)\bar$/

. Мы будем использовать функцию, чтобы сделать вещи более красивыми позже

function multilineRegExp(regs, options) {
    return new RegExp(regs.map(
        function(reg){ return reg.source; }
    ).join(''), options);
}

А теперь давайте скажем

var r = multilineRegExp([
     /^foo/,  // we can add comments too
     /(.*)/,
     /\bar$/
]);

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

19
ответ дан Riccardo Galli 28 August 2018 в 07:25
поделиться
Другие вопросы по тегам:

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