Учитывая следующую строку...
ABC DEF GHI: 319 022 6543 QRS : 531 450
Я пытаюсь извлечь все диапазоны, которые начинаются/заканчиваются цифрой и могут содержать пробелы, но я хочу, чтобы эти пробелы были удалены.
Например, приведенное выше должно дать два результата (поскольку есть два «диапазона», которые соответствуют тому, что я ищу)...
3190226543
531450
Моя первая мысль была такой, но это соответствует пробелам между буквами...
([\d\s])
Затем я попробовал это, но, похоже, это не имело никакого эффекта ...
([\d+\s*])
Этот подходит близко, но также захватывает конечные пробелы. Кроме того, это захватывает пробел, но не удаляет его.
(\d[\d\s]+)
Если невозможно удалить пробелы в одном выражении, я всегда могу выполнить постобработку групп, если смогу их правильно извлечь. Это самое последнее утверждение близко, но как мне сказать, что не заканчивается пробелом, но только цифрой?
Так какое же пропущенное выражение? Кроме того, поскольку иногда люди просто публикуют ответ, было бы полезно также объяснить регулярное выражение, чтобы помочь другим понять, как это сделать. Я, например, хотел бы не только решение, но и объяснение. :)
Примечание. Я знаю, что могут быть некоторые различия между RegEx на разных платформах, так что это нормально, если эти различия оставлены на усмотрение читателя. Я больше заинтересован в понимании базовой механики самого регулярного выражения, чем в синтаксисе. Тем не менее, если это поможет, я использую Swift и C#.
Я не думаю, что вы можете сделать это в одном выражении. Я думаю, вам, вероятно, потребуется захватить группы с пробелами, а затем удалить пробелы, или удалить пробелы, а затем захватить группы.
Я обновлял вопрос, когда вы ответили. Я могу постобработать группы, это нормально. НО... как мне помешать им также захватывать конечные пробелы/вкладки? Можете ли вы сказать: «Вы должны начинать и заканчивать цифру, даже если она состоит только из одной цифры?»
Используйте \d(?:[\d\s]*\d)?
@WiktorStribiżew, можете ли вы ответить на это и объяснить, как это работает? :)
Если вы удаляете пробелы на этапе постобработки, зачем вам конечные пробелы? string result = match.Value.Replace(" ", "");
удаляет все пробелы, включая завершающие.
Хорошая точка зрения. Вопрос развивался по мере поступления ответов/комментариев. О постобработке не думали, пока я не понял, что это невозможно, поэтому я все еще думал о первоначальном захвате.
Вы не можете избавиться от пробелов внутри значения соответствия в рамках одной операции сопоставления. Вам нужно будет удалить пробелы в качестве шага постобработки.
Чтобы сопоставить строку, начинающуюся с цифры, а затем необязательно содержащую любое количество цифр или пробелов, а затем цифру, которую вы можете использовать
\d(?:[\d\s]*\d)?
Подробности:
\d
- цифра(?:[\d\s]*\d)?
- необязательное групповое сопоставление без захвата
[\d\s]*
- ноль или более пробелов/цифр\d
- цифра.
Вы не можете избавиться от пробелов внутри значения соответствия в рамках одной операции сопоставления. Вам нужно будет удалить пробелы в качестве шага постобработки.