Регулярное выражение для сопоставления 3 или 4 выражений части с разделителями пробела и пробела

1

Мне нужно использовать регулярное выражение для выбора выражений, которые могут принимать следующие формы:

Name 23:12

Или же

2 Name 122:181

Это всегда один и тот же формат:

  1. строка, пробел, затем число, символ двоеточия, затем другое число или
  2. Однозначное number, space, string, другое space, затем number, символ colon и последнее number.

До сих пор я использовал следующее:

/(?: |:)+/

Но, конечно, это не работает для второго сценария.

Код регулярного выражения используется в бите JavaScript в Drafts for iOS для управления текстом:

var StringSparsed = String.split(/(?: |:)+/);

Затем в массиве StringSparsed полученном из функции split, я хочу только три элемента:

  1. Имя (либо первая string либо первая single digit + string)
  2. number перед символом двоеточия
  3. Последний number

Я не мог понять это самостоятельно. Любая идея?

ура

  • 0
    почему он не работает, не расщепляется на пробелы и двоеточия?
  • 0
    Да, мне очень жаль, что я не упомянул то, что искал ... в массиве, полученном в результате функции split, мне нужно только три результата: имя (либо просто строка, либо первое единственное число + строка), число перед символом двоеточия, и последний номер ...
Показать ещё 3 комментария
Теги:

5 ответов

0

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

var regex = /(\d+\s)?(\w+)\s(\d+):(\d+)/;
var matches = "1 Name 23:32".match(regex);
console.log(matches);

Объединив его таким образом, вы получите массив. В индексе [0] вы найдете весь матч. В индексе [1] вы найдете номер (если строка начинается с одного) или неопределенный (просто противоположный случай). Другой индекс от [2] до [4] обязательно будет содержать строку "Имя", цифры перед двоеточие и цифры после толстой кишки, всегда в этом порядке. Я бы сохранил его более точно, когда я могу использовать регулярное выражение, чтобы избежать несоответствий.

Надеюсь это поможет!

  • 0
    Ничего себе, это действительно хорошо и открывает новые возможности. Большое спасибо @riot!
  • 0
    @Manitoba: Я здесь, чтобы помочь, рад, что сделал свою работу. Вы можете узнать больше на RegExp MDN js docs, если вы никогда не смотрели на него. Вы объясняете довольно хорошо!
0

Пытаться

/(?:[^\d] |:)/

Это предполагает, что строка не заканчивается цифрой.

Я удалил + в конце, потому что он появляется только в одном месте или один двоеточие будет отображаться в любой позиции, а не "один или несколько", как указано символом +.

Но ИМО было бы проще использовать регулярное выражение для получения совпадений вместо использования split().

  • 0
    все, что работает :), но регулярное выражение довольно просто :) просто нужно немного практики
0

Используйте ниже регулярное выражение для покрытия обоих сценариев:

^[0-9]?\s?[a-zA-Z]*\s[0-9]*:[0-9]*$
  • 0
    Эй, это прекрасно работает при тестировании в regex101, но не может заставить его работать в моем приложении с StringSparsed.split(^[0-9]?\s?[a-zA-Z]*\s[0-9]*:[0-9]*$); , Я думаю, это не проблема из вашего кода.
0

Вы можете подобрать нужные детали и вернуть остальную часть соответствующих деталей.

var getParts = s => s.match(/^(.*) (\d+):(\d+)$/).slice(1);

console.log(getParts('Name 23:12'));
console.log(getParts('2 Name 122:181'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
  • 0
    О, извините, я забыл упомянуть, что это должно дать мне конкретные результаты, я буду обновлять оригинальный пост. Извините ребята
  • 0
    Это выглядит великолепно, но как я могу получить «2 Name», «122», «181» в результате для второго сценария?
0

Я не профессионал, но я понял, используя /(? :: |:) +/вы пропускаете все пробелы и переходите к предполагаемому результату

Ещё вопросы

Сообщество Overcoder
Наверх
Меню