Строка дополняется необязательной заготовкой с максимальной длиной - PullRequest
0 голосов
/ 12 октября 2011

У меня проблема с построением регулярного выражения. это образец текста:

text 123 12345 abc 12    def 67 i 89 o 0    t 2

Числа иногда дополняются пробелами до максимальной длины (3). e.g.:

  • «1» может быть «1» или «1»
  • «13» может быть «13» или «13»

Мое регулярное выражение в данный момент это:

\b([\d](\s*)){1,3}\b

Результаты этого регулярного выражения следующие: (. = пусто для лучшей видимости)

123.
12....
67.
89.
0....
2

Но мне нужно это: (. = Пусто для лучшей видимости)

123
12.
67.
89.
0..
2

Как мне заставить механизм регулярных выражений считать пробелы в опции {1,3}?

Ответы [ 4 ]

0 голосов
/ 12 октября 2011

Предполагая, что вы хотите использовать дополненные числа где-то еще, разбейте проблему на две части; (простой) разбор чисел и (простой) форматирование чисел (включая заполнение).

while ( $text =~ /\b(\d{1,3})\b/g ) {
  printf( "%-3d\n", $1 );
}

В качестве альтернативы:

@padded_numbers = map { sprintf( "%-3d", $_ ) } ( $text =~ /\b(\d{1,3})\b/g )
0 голосов
/ 12 октября 2011

Я думаю, что вы хотите это

\b(?:\d[\d\s]{0,2})(?!\d)

Посмотрите это здесь на Regexr

граница слова не будет работать в конце, потому что, если конецсовпадение - это пробел, границы слова нет.Поэтому я использую отрицательный прогноз (?!\d), чтобы не было следующих цифр.

Но если у вас есть строка типа «1 23».Он будет соответствовать только «2» и «23», но не будет пробелом после первых «2».

0 голосов
/ 12 октября 2011

Попробуйте это:

\b(?:\d[\d\s]{0,2})(?:(?<=\s)|\b)

Это также охватывает строки типа text 123 1 23 12345 123abc 12 def 67 i 89 o 0 t 2 и приводит к:

123
1.
23.
12.
67.
89.
0..
2
0 голосов
/ 12 октября 2011

Делает ли это то, что вы хотите?

\b(\d){1,3}\s*\b

Это также будет включать пробелы (если доступны) после выбора.

...