круглые скобки регулярных выражений [дубликат]

Я знаю, что этот вопрос древний, но в интересах любого, кто ищет решения, вот еще одна стратегия для баз данных, которые не поддерживают такие функции, как MONTH ():

  db.session.  query (sa.func.count (Article.id)). \ group_by (sa.func.strftime ("% Y-% m-% d", Article.created)). all ()  

По существу это превращает метки времени в усеченные строки, которые затем можно сгруппировать.

Если вам нужны только самые последние записи, вы можете добавить, например:

  order_by (Article.created.desc ()). limit (7)  

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

95
задан Peter Mortensen 4 March 2011 в 21:10
поделиться

23 ответа

Что бы я делал, это игнорировать формат и проверять числовое содержимое:

var originalPhoneNumber = "415-555-1212";

function isValid(p) {
  var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/;
  var digits = p.replace(/\D/g, "");
  return phoneRe.test(digits);
}
84
ответ дан Community 16 August 2018 в 10:49
поделиться
  • 1
    отличный комментарий, вы объяснили мне о вещах, которые я игнорирую, большое спасибо – Castro Roy 2 December 2010 в 19:59
  • 2
    Я согласен, что регулярное выражение недостаточно для проверки номеров телефонов, поскольку план нумерации телефонов фактически работает на основе диапазона, например. 12300000 - 12399999 ( numberingplans.com/… ) – user 27 August 2014 в 13:14
  • 3
  • 4
    Согласитесь на игнорирование форматирования, например. для мобильных номеров очень часто присутствуют пробелы, такие как XXXX XXX XXX, но для форм, требующих ввода без пробелов, т. е. как XXXXXXXXXX. – RobG 5 January 2018 в 07:28
87
ответ дан Community 6 September 2018 в 05:13
поделиться

Я бы предложил использовать что-то более ясное (особенно думая, кому нужно будет поддерживать код) ... как насчет:

var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
               formats
                 .replace(/([\(\)])/g, "\\$1")
                 .replace(/9/g,"\\d") +
               ")$");

, где регулярное выражение построено из прозрачного шаблона? Добавление нового было бы без проблем, и даже сам клиент мог бы сделать это на странице «Параметры».

8
ответ дан 6502 16 August 2018 в 10:49
поделиться

Следующий REGEX будет проверять любой из этих форматов:

(123) 456-7890 123-456-7890 123.456.7890 1234567890

/^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/
24
ответ дан Billbad 16 August 2018 в 10:49
поделиться
  • 1
    Вам нужно избежать ., иначе он будет соответствовать произвольному символу, нарушив ваше регулярное выражение. – Christoph 12 March 2013 в 12:25
  • 2
    Это привело меня в правильном направлении. Благодаря! К сожалению, это выражение также будет соответствовать (1234567890 и 123) 4567890. ^ ((([0-9] {3})) | ([0-9] {3})) [- \ s \.] [0-9] {3} [- \ s \.]? [0-9] {4} $ заботится об этой маленькой проблеме. – Joe Hawkins 26 June 2015 в 20:52

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

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/

на

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

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

0
ответ дан Christoph 16 August 2018 в 10:49
поделиться
  • 1
    Я действительно пытаюсь запустить игру Regex! Я проверяю ваше предложение, используя & quot; Regex Coach. & Quot; Я использую regex (()? \ D {3} ())? (- | \ s)? \ D {3} (- | \ s)? \ D {4} и целевую строку (123) 456-7890, но по какой-то причине он захватывает только последние 7 цифр. Есть идеи? – Aaron Hathaway 2 December 2010 в 19:17
  • 2
    Регулярное регулярное выражение немного грубо на мозги ... и терпение. Ok try / ^ [(]? (\ D {3}) [)]? [- | \ s]? (\ D {3}) [- | \ s]? (\ D {4}) $ / первая часть старшего регулярного выражения не преуспела: & quot; (()? \ d {3} ()) & quot; (() средняя скобка была фактически замечена как часть синтаксиса регулярных выражений, а не символов, которые нужно искать. – Luc Veronneau 2 December 2010 в 19:27
\\(?\d{3}\\)?([\-\s\.])?\d{3}\1?\d{4}

Это подтвердит любой номер телефона с переменным форматом:

\\(?\d{3}\\)? находит 3 цифры, заключенные в скобки или нет.

([\-\s\.])? находит любой из этих разделителей символы или нет

\d{3} находит 3 цифры

\1 использует первый согласованный разделитель - это гарантирует, что разделители будут одинаковыми. Таким образом, (000) 999-5555 не будет проверяться здесь, потому что есть разделитель пробела и тире, поэтому просто удалите «\ 1» и замените суб-шаблон разделителя (это также будет проверять нестандартные форматы). Тем не менее, вы должны указывать формат для ввода пользователем.

\d{4} находит 4 цифры

Проверяет:

  • (000) 999 5555
  • (000) -999-5555
  • (000) .999.5555
  • (000) 999-5555
  • (000) 9995555
  • 000 999 5555
  • 000-999-5555
  • 000.999.5555
  • 0009995555

BTW это для JavaScript, следовательно, для двойного экранирования.

1
ответ дан Dacmeaux 16 August 2018 в 10:49
поделиться

Это будет работать:

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

Символ ? означает, что предыдущая группа должна совпадать с нулем или один раз. Группа (-|\s) будет соответствовать символу - или |. Добавление ? после второго появления этой группы в вашем регулярном выражении позволяет вам сопоставить последовательность из десяти последовательных цифр.

4
ответ дан Donut 16 August 2018 в 10:49
поделиться
/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g

(123) 456-7890 + (123) 456-7890 + (123) -456-7890 + (123) - 456-7890 + (123) - 456-78-90 123- 456-7890 123.456.7890 1234567890 +31636363634 075-63546725

Это очень свободный вариант, и я предпочитаю держать его таким образом, в основном я использую его в регистрационных формах, где пользователи должны добавьте их номер телефона. Обычно у пользователей возникают проблемы с формами, которые обеспечивают соблюдение строгих правил форматирования, я предпочитаю, чтобы пользователь заполнил номер и формат, который он отображает, или перед тем, как сохранить его в базе данных. http://regexr.com/3c53v

13
ответ дан elishas 16 August 2018 в 10:49
поделиться
  • 1
    регулярное выражение, слегка модифицированное, чтобы позволить, например, для +41 (79) 123 45 67 (Швейцария): /^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g – Remigius Stalder 26 July 2018 в 11:05
  • 2
  • 3

Ответы каждого замечательные, но вот один из них, я думаю, немного более полный ...

Это написано для использования javascript одного числа в одной строке:

^(?!.*911.*\d{4})((\+?1[\/ ]?)?(?![\(\. -]?555.*)\( ?[2-9][0-9]{2} ?\) ?|(\+?1[\.\/ -])?[2-9][0-9]{2}[\.\/ -]?)(?!555.?01..)([2-9][0-9]{2})[\.\/ -]?([0-9]{4})$

Если вы хотите совпадать с границами слов, просто измените ^ и $ на \ b

. Я приветствую любые предложения, исправления или критику этого решения. Насколько я могу судить, это соответствует формату NANP (для номеров США - я не проверял другие североамериканские страны при создании этого), избегает любых ошибок 911 (не может быть в коде страны или региональном коде), устраняет только те 555 номеров, которые фактически недействительны (код региона 555, за которым следует 01xx, где x = любое число).

3
ответ дан Erasmus 16 August 2018 в 10:49
поделиться
[Д0] / ^ + 1 \ S * (\ d {3} (:) | [- | \ с]??????) \ S * \ d {3} [- | \ с]? \ d {4} $ /

Хотя этот пост является старым, но хочет оставить мой вклад. (555) 555-5555 1 555 555 5555 1 555-555-5555 1 (555) 555-5555

это не принято: 555-5555 -> принять это использование: ^ +? 1? \ s *? (? (\ d {3})? (? :) | [- | \ s])? \ s *? \ d {3} [- | \ s]? \ D {4} $ 5555555 -> принять это использование: ^ +? 1? \ S *? (? (\ D {3})? (? :) | [- | \ s])? \ s *? \ d {3} [- | \ s]? \ d {4} $ 1 555) 555-5555 123 ** & amp; !! asdf # 55555555 (6505552368) 2 (757) ) 622-7382 0 (757) 622-7382 -1 (757) 622-7382 2 757 622-7382 10 (757) 622-7382 27576227382 (275) 76227382 2 (757) 6227382 2 (757) 622-7382 (555) ) 5 (55?) - 5555

это код, который я использовал:

function telephoneCheck(str) {
  var patt = new RegExp(/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/);
  return patt.test(str);
}

telephoneCheck("+1 555-555-5555");
0
ответ дан Flavio Ferreira 16 August 2018 в 10:49
поделиться

Где str может быть любой из этих форм: 555-555-5555 (555) 555-5555 (555) 555-5555 555 555 5555 5555555555 1 555 555 5555

function telephoneCheck(str) {
  var isphone = /^(1\s|1|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/.test(str);
  alert(isphone);
}
telephoneCheck("1 555 555 5555");

12
ответ дан Frawel 16 August 2018 в 10:49
поделиться

Существует слишком много вариантов регулярных выражений для проверки номера телефона. Я рекомендую эту статью: JavaScript: HTML-форма - проверка номера телефона , где для каждого случая указаны несколько вариантов. Если вы хотите углубить регулярное выражение для пользовательского выражения, вы можете просмотреть эту документацию .

0
ответ дан gras 16 August 2018 в 10:49
поделиться

Парсер парсера Javascript с метаданными для более чем 200 стран: https://github.com/googlei18n/libphonenumber

17
ответ дан josh3736 16 August 2018 в 10:49
поделиться
  • 1
    Это намного мощнее и элегантнее, чем попытка использовать регулярное выражение ... и оно также входит в Ruby, Python и C #. Проверьте это. :) – Aaron Gray 15 July 2013 в 19:07

Если вы ищете 10 и всего 10 цифр, игнорируйте все, кроме цифр -

   return value.match(/\d/g).length===10;
46
ответ дан kennebec 16 August 2018 в 10:49
поделиться
  • 1
    Это то, что я собирался предложить. Легко свежий. И слишком много валидации может быть плохой. – mwilcox 2 December 2010 в 23:25
  • 2
    Это лучший способ пойти. Если вы ДЕЙСТВИТЕЛЬНО не заботитесь о том, в каком формате он находится, все это делает, чтобы убедиться, что номер частично действителен, а не куча суматохи. – mdance 30 November 2012 в 01:14
  • 3
    Вы говорите, что совпадение (/ \ d / g) не соответствует (/ \ d /), или длина будет 1, а не 10; Кроме того, совпадение в пустой строке равно null. По крайней мере, это должно быть var m = value.match (/ \ d / g); return m & amp; & amp; m.length === 10 – Doug 22 September 2014 в 08:08
  • 4
    Или return (value.match(/\d/g) || []).length == 10 или намного проще (но в равной степени ошибочно): return value.replace(/\D/g,'').length == 10. – RobG 23 August 2016 в 05:56

Моим регулярным выражением является следующее:

/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

Допустимые форматы:

(123) 456-7890 (123)456-7890 123-456-7890 123.456.7890 1234567890 +31636363634 075-63546725

79
ответ дан marty 16 August 2018 в 10:49
поделиться
  • 1
    Что такое / im? Невозможно найти объяснение в google :) – Sarin Suriyakoon 3 July 2017 в 02:29
  • 2
    @SarinSuriyakoon i делает выражение нечувствительным к регистру, а m выполняет многострочный поиск – Rodrigo Leite 3 August 2017 в 15:20
  • 3
    зачем вам нужна нечувствительность к регистру для чисел? – Solomon Closson 27 February 2018 в 20:03

Просто захотелось добавить решение специально для выбора нелокальных телефонных номеров (800 и 900 типов).

(\+?1[-.(\s]?|\()?(900|8(0|4|5|6|7|8)\3+)[)\s]?[-.\s]?\d{3}[-.\s]?\d{4}
0
ответ дан Mike T 16 August 2018 в 10:49
поделиться

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

Символ ? означает, что предыдущая группа должна совпадать с нулем или один раз. Группа (-|\s) будет соответствовать символу - или |.

0
ответ дан Ren 16 August 2018 в 10:49
поделиться

Простое регулярное выражение: /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g

Проверьте формат, надеюсь, что он работает: 444-555-1234 f: 246.555.8888 m: 1235554567

0
ответ дан Rodrigo Leite 16 August 2018 в 10:49
поделиться
  • 1
    Отформатируйте свой ответ (используйте четыре пробела в качестве отступов для кодового блока). Объяснение вашего кода также повысит его качество. – Nander Speerstra 4 April 2017 в 13:28
  • 2
    Спасибо @NanderSpeerstra за ваше предложение. На самом деле я новичок в stackoverflow. – sahed sawon 6 April 2017 в 09:23

Попробуйте это: он также включает проверку для международных форматов.

/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g

Это регулярное выражение проверяет следующий формат:

  • ( 541) 754-3010 Внутренние
  • + 1-541-754-3010 Международные
  • 1-541-754-3010 Набранные в США
  • 001-541 -754-3010 Набирается из Германии
  • 191 541 754 3010 Набирается из Франции
4
ответ дан roelofs 16 August 2018 в 10:49
поделиться

Эта функция хорошо работала для нас:

let isPhoneNumber = input => {

  try {
    let ISD_CODES = [93, 355, 213, 1684, 376, 244, 1264, 672, 1268, 54, 374, 297, 61, 43, 994, 1242, 973, 880, 1246, 375, 32, 501, 229, 1441, 975, 591, 387, 267, 55, 246, 1284, 673, 359, 226, 257, 855, 237, 1, 238, 1345, 236, 235, 56, 86, 61, 61, 57, 269, 682, 506, 385, 53, 599, 357, 420, 243, 45, 253, 1767, 1809, 1829, 1849, 670, 593, 20, 503, 240, 291, 372, 251, 500, 298, 679, 358, 33, 689, 241, 220, 995, 49, 233, 350, 30, 299, 1473, 1671, 502, 441481, 224, 245, 592, 509, 504, 852, 36, 354, 91, 62, 98, 964, 353, 441624, 972, 39, 225, 1876, 81, 441534, 962, 7, 254, 686, 383, 965, 996, 856, 371, 961, 266, 231, 218, 423, 370, 352, 853, 389, 261, 265, 60, 960, 223, 356, 692, 222, 230, 262, 52, 691, 373, 377, 976, 382, 1664, 212, 258, 95, 264, 674, 977, 31, 599, 687, 64, 505, 227, 234, 683, 850, 1670, 47, 968, 92, 680, 970, 507, 675, 595, 51, 63, 64, 48, 351, 1787, 1939, 974, 242, 262, 40, 7, 250, 590, 290, 1869, 1758, 590, 508, 1784, 685, 378, 239, 966, 221, 381, 248, 232, 65, 1721, 421, 386, 677, 252, 27, 82, 211, 34, 94, 249, 597, 47, 268, 46, 41, 963, 886, 992, 255, 66, 228, 690, 676, 1868, 216, 90, 993, 1649, 688, 1340, 256, 380, 971, 44, 1, 598, 998, 678, 379, 58, 84, 681, 212, 967, 260, 263],
      //extract numbers from string
      thenum = input.match(/[0-9]+/g).join(""),
      totalnums = thenum.length,
      last10Digits = parseInt(thenum) % 10000000000,
      ISDcode = thenum.substring(0, totalnums - 10);

    //phone numbers are generally of 8 to 16 digits
    if (totalnums >= 8 && totalnums <= 16) {
      if (ISDcode) {
        if (ISD_CODES.includes(parseInt(ISDcode))) {
          return true;
        } else {
          return false;
        }
      } else {
        return true;
      }
    }
  } catch (e) {}

  return false;
}

console.log(isPhoneNumber('91-9773207706'));

0
ответ дан student 16 August 2018 в 10:49
поделиться

Если вы используете тег ввода, который этот код вам поможет. Я пишу этот код самостоятельно, и я думаю, что это очень хороший способ использования в качестве входных данных. но вы можете изменить его, используя свой формат. Это поможет пользователю исправить свой формат на входном теге.

$("#phone").on('input', function() {  //this is use for every time input change.
        var inputValue = getInputValue(); //get value from input and make it usefull number
        var length = inputValue.length; //get lenth of input

        if (inputValue < 1000)
        {
            inputValue = '1('+inputValue;
        }else if (inputValue < 1000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, length);
        }else if (inputValue < 10000000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, length);
        }else
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, 10);
        }       
        $("#phone").val(inputValue); //correct value entered to your input.
        inputValue = getInputValue();//get value again, becuase it changed, this one using for changing color of input border
       if ((inputValue > 2000000000) && (inputValue < 9999999999))
      {
          $("#phone").css("border","black solid 1px");//if it is valid phone number than border will be black.
      }else
      {
          $("#phone").css("border","red solid 1px");//if it is invalid phone number than border will be red.
      }
  });

    function getInputValue() {
         var inputValue = $("#phone").val().replace(/\D/g,'');  //remove all non numeric character
        if (inputValue.charAt(0) == 1) // if first character is 1 than remove it.
        {
            var inputValue = inputValue.substring(1, inputValue.length);
        }
        return inputValue;
}
0
ответ дан user 16 August 2018 в 10:49
поделиться

В Google есть хорошая библиотека для обработки телефонных номеров в Javascript: https://github.com/googlei18n/libphonenumber . Работает также с Java и C ++.

Я бы предпочел использовать их, потому что этот должен быть действительно хорошо протестирован в процессе производства. Поэтому это должно быть безопасно для включения.

0
ответ дан Ville Venäläinen 16 August 2018 в 10:49
поделиться
1
ответ дан Nikita Shahov 29 October 2018 в 11:47
поделиться
Другие вопросы по тегам:

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