Как создать RegExp, соответствующий любой начальной части RegExp?

Я ищу выражение, соответствующее ^[0-9]{2}:[0-9]{2} - [0-9]{2}:[0-9]{2}$, и любую строку, соответствующую любому началу этого выражения.

Так что в принципе...

      /^[0-9]{2}:[0-9]{2} - [0-9]{2}:[0-9]{2}$/ ||
      /^[0-9]{2}:[0-9]{2} - [0-9]{2}:[0-9]{1}$/ ||
      /^[0-9]{2}:[0-9]{2} - [0-9]{2}:$/ ||
      /^[0-9]{2}:[0-9]{2} - [0-9]{2}$/ ||
      /^[0-9]{2}:[0-9]{2} - [0-9]{1}$/ ||
      /^[0-9]{2}:[0-9]{2} - $/ ||
      /^[0-9]{2}:[0-9]{2} -$/ ||
      /^[0-9]{2}:[0-9]{2} $/ ||
      /^[0-9]{2}:[0-9]{2}$/ ||
      /^[0-9]{2}:[0-9]{1}$/ ||
      /^[0-9]{2}:$/ ||
      /^[0-9]{2}$/ ||
      /^[0-9]{1}$/

...Именно это я и использую сейчас. Но мне хотелось бы сделать это короче.

/^[0-9]{0,2}:?[0-9]{0,2} ?-? ?[0-9]{0,2}:?[0-9]{0,2}$/ у меня не работает, так как это тоже соответствует, например, "22: - 23:00".

Возможно?

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

Aaron 27.05.2024 17:05

Идея, которую я еще не использовал: вместо создания длинного сложного шаблона, почему бы и нет... 1.) создать переменный формат с допустимой строкой 00:00 - 00:00 2.) использовать простой шаблон, например ^\d{2} :\d{2} - \d{2}:\d{2}$ 3.) заполните str для проверки формата и шаблона проверки. Посмотрите эту демонстрацию JS на tio.run

bobble bubble 27.05.2024 19:05

Приведите примеры входных данных, которые должны совпадать, и примеры, которые не должны совпадать.

Bohemian 29.05.2024 01:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я ожидаю, что вы ищете следующее, которое я написал в расширенном режиме или режиме со свободным интервалом (/x), чтобы было легче писать и читать.

^\d
  (?:\d
    (?::
      (?:\d
        (?:\d
          (?:\s
            (?:-
              (?:\s
                (?:\d
                  (?:\d
                    (?::
                      (?:\d{1,2}
                      )?
                    )?
                  )?
                )?
              )?
            )?
          )?
        )?
      )?
    )?
  )?$

В расширенном режиме все пробелы удаляются на этапе предварительной обработки, за исключением случаев, когда пробелы экранированы (\s, \ ), находятся внутри класса символов ([ ]) или так определены токеном Unicode ([[:space:]], \p{Space}).

Вопросительный знак в конце каждого

(?:...                     ...)?

делает группу без захвата необязательной.

Демо

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

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

Посмотрите эту ванильную демонстрацию JS на tio.run или попробуйте следующий фрагмент.

$("#checkStr").on("keyup", function()
{
  // any valid string
  const format = '00:00 - 00:00';
    
  // simple pattern
  const p = /^\d\d:\d\d - \d\d:\d\d$/;
  
  // fill up with format and test
  let valid =  p.test(this.value+format.substring(this.value.length));
  
  // demo showcase
  if (!valid) {
    this.style.backgroundColor = '#eea39c';
    this.value = this.value.substring(0, this.value.length-1);
  } setTimeout(() => { this.style.backgroundColor = '#88dd85'; }, 700);
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js">
</script><input id = "checkStr" style = "font-size: 20px" type = "text" value = "">

Другие вопросы по теме