Как лучше всего использовать RegEx для захвата групп цифр, игнорируя любые пробелы в них

Учитывая следующую строку...

ABC DEF GHI: 319 022 6543 QRS : 531 450

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

Например, приведенное выше должно дать два результата (поскольку есть два «диапазона», которые соответствуют тому, что я ищу)...

3190226543
531450

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

([\d\s])

Затем я попробовал это, но, похоже, это не имело никакого эффекта ...

([\d+\s*])

Этот подходит близко, но также захватывает конечные пробелы. Кроме того, это захватывает пробел, но не удаляет его.

(\d[\d\s]+)

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

Так какое же пропущенное выражение? Кроме того, поскольку иногда люди просто публикуют ответ, было бы полезно также объяснить регулярное выражение, чтобы помочь другим понять, как это сделать. Я, например, хотел бы не только решение, но и объяснение. :)

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

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

Wiktor Stribiżew 17.05.2022 18:20

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

DiplomacyNotWar 17.05.2022 18:20

Я обновлял вопрос, когда вы ответили. Я могу постобработать группы, это нормально. НО... как мне помешать им также захватывать конечные пробелы/вкладки? Можете ли вы сказать: «Вы должны начинать и заканчивать цифру, даже если она состоит только из одной цифры?»

Mark A. Donohoe 17.05.2022 18:23

Используйте \d(?:[\d\s]*\d)?

Wiktor Stribiżew 17.05.2022 18:27

@WiktorStribiżew, можете ли вы ответить на это и объяснить, как это работает? :)

Mark A. Donohoe 17.05.2022 18:27

Если вы удаляете пробелы на этапе постобработки, зачем вам конечные пробелы? string result = match.Value.Replace(" ", ""); удаляет все пробелы, включая завершающие.

Olivier Jacot-Descombes 17.05.2022 18:32

Хорошая точка зрения. Вопрос развивался по мере поступления ответов/комментариев. О постобработке не думали, пока я не понял, что это невозможно, поэтому я все еще думал о первоначальном захвате.

Mark A. Donohoe 17.05.2022 18:34
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
7
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

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

\d(?:[\d\s]*\d)?

Подробности:

  • \d - цифра
  • (?:[\d\s]*\d)? - необязательное групповое сопоставление без захвата
    • [\d\s]* - ноль или более пробелов/цифр
    • \d - цифра.

См. демонстрация регулярных выражений.

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