Regex, чтобы НЕ соответствовать строке с 10 последовательными цифрами.Цифры могут быть разделены пробелом.Все остальные строки возвращают совпадение - PullRequest
1 голос
/ 17 апреля 2019

У меня есть кодовая ручка с прохождением 5/7 модульных тестов.Застрял в строках, начинающихся с нецифровых символов.

https://codepen.io/david-grieve/pen/pBpGoO?editors=0012

var regexString = /^\D*(?!(\s*\d\s*){10,}).*/;

var regexString = /^\D*(?!(\s*\d\s*){10,}).*/;

var tests = [{
    text: 'abc123',
    ismatch: true
  }, {
    text: '1234567890',
    ismatch: false
  }, {
    text: '123456789',
    ismatch: true
  }, {
    text: 'abc1234567890efg',
    ismatch: false
  }, {
    text: '123 456 789 123',
    ismatch: false
  },
  {
    text: 'abc1234567890',
    ismatch: false
  }, {
    text: '1234567890efg',
    ismatch: false
  }
];

console.log(new Date().toString());
tests.map(test => console.log(test.text, regexString.test(test.text) == test.ismatch));

С этим регулярным выражением следующие строки проходят модульные тесты

  • "abc123" true
  • "1234567890" true
  • "123456789" true
  • "123 456 789 123" true
  • "1234567890efg" true

Эти тесты не пройдены

  • "abc1234567890" false
  • "abc1234567890efg" false

Примечание: / ^ \ D {3,} (?! (\ S * \ d \ s *){10,}). * / Проходит все тесты, но явно не прав.

1 Ответ

1 голос
/ 17 апреля 2019

Проблема с ^\D*(?! заключается в том, что даже если длинная цифра / пробел будет найдена в отрицательном поиске, часть, соответствующая \D, будет просто возвращать один символ после совпадения отрицательного просмотра , Например, когда

^\D*(?!\d{10,}).*

соответствует

abc1234567890

\D* соответствует ab, а .* соответствует c1234567890. Позиция между b и c не является немедленно , за которой следует длинная подстрока числа / пробела, поэтому совпадение не может быть неудачным.

Кроме того, поскольку некоторые цифры могут приходить до 10 последовательных цифр, ^\D* в начале будет недостаточно - например, что, если вводится 1a01234567890? Вместо этого попробуйте

^(?!.*(\d\s*){10}).*

Это гарантирует, что за каждой позицией не следует (10 цифр, возможно разделенных пробелами).

https://regex101.com/r/v7t4IC/1

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

^\D*+(?!(\s*\d\s*){10,}).*
    ^

https://regex101.com/r/eGdw2l/1

(но Javascript, к сожалению, не поддерживает такой синтаксис)

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