Regex с группой захвата не работает, но без группы захвата работает отлично [дубликат]

Другим вариантом, если производительность является проблемой, является использование расширения data.table для расширения reshape2 расплава & amp; dcast functions

( Ссылка: эффективная перестройка с использованием data.tables )

library(data.table)

setDT(dat1)
dcast(dat1, name ~ numbers, value.var = "value")

#          name          1          2         3         4
# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078
# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814

И, как и в data.table v1.9.6, мы можем использовать несколько столбцов

## add an extra column
dat1[, value2 := value * 2]

## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))

#          name    value_1    value_2   value_3   value_4   value2_1   value2_2 value2_3  value2_4
# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078  0.3672866 -1.6712572 3.190562 0.6590155
# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814 -1.6409368  0.9748581 1.476649 1.1515627

59
задан David19801 20 December 2011 в 14:14
поделиться

9 ответов

Они называются кванторами.

* 0 или более из предыдущего выражения

+ 1 или более из предыдущего выражения

Per по умолчанию квантификатор жадный, это означает, что он соответствует как можно большему количеству символов.

? после квантификатора изменяет поведение, чтобы сделать этот квантификатор «неровным», означает, что он будет соответствовать как можно меньше.

Пример greedy / ungreedy

Например, в строке « abab »

a.*b будет соответствовать «abab» (preg_match_all будет возвращать одно совпадение «abab»)

, в то время как a.*?b будет соответствовать только стартовому «ab» (preg_match_all вернет два совпадения, «ab»)

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

96
ответ дан Morten Jensen 22 August 2018 в 22:45
поделиться

Я думаю, что в предыдущих ответах не удалось выделить простой пример:

, например, у нас есть массив:

numbers = [5, 15]

Следующее выражение регулярного выражения ^[0-9]+ соответствует: 15 только. Однако ^[0-9]* соответствует как 5 and 15. Разница в том, что для оператора + требуется, по крайней мере, один дубликат предыдущего выражения регулярного выражения

0
ответ дан Crt 22 August 2018 в 22:45
поделиться

A + соответствует одному или нескольким экземплярам предыдущего шаблона. * соответствует нулю или более экземплярам предыдущего шаблона.

Итак, в основном, если вы используете +, должен быть хотя бы один экземпляр шаблона, если вы используете *, он будет по-прежнему совпадают, если нет экземпляров.

5
ответ дан DaveRandom 22 August 2018 в 22:45
поделиться

+ минимальна, * также может быть нулевой.

5
ответ дан jeroen 22 August 2018 в 22:45
поделиться

Звезда очень похожа на плюс, единственное отличие состоит в том, что, когда плюс соответствует 1 или более предшествующим символу / группе, начало соответствует 0 или более.

3
ответ дан Madara Uchiha 22 August 2018 в 22:45
поделиться

В RegEx {i,f} означает, что «между i и f соответствует». Давайте посмотрим на следующие примеры:

  • {3,7} означает от 3 до 7 соответствий
  • {,10} означает до 10 совпадений без нижнего предела (т.е. нижний предел равен 0)
  • {3,} означает не менее 3 совпадений без верхнего предела (т.е. верхний предел бесконечен)
  • {,} означает, что верхний предел или нижний предел для количество совпадений (т. е. нижний предел равен 0, а верхний предел бесконечен)
  • {5} означает ровно 4

Большинство хороших языков содержат сокращения, RegEx:

  • + является сокращением для {1,}
  • * является сокращением для {,}
  • ? является сокращенное значение для {,1}

Это означает, что + требует не менее 1 совпадения, в то время как * принимает любое количество совпадений или не имеет совпадений вообще, а ? принимает не более 1 совпадающие или нулевые.

Кредит: Codecademy.com

1
ответ дан Miladiouss 22 August 2018 в 22:45
поделиться

Первый (+) - один или несколько символов . Второй (*) - ноль или более символов . Оба не являются жадными (?) и соответствуют чему-либо (.).

17
ответ дан Quentin 22 August 2018 в 22:45
поделиться

Рассмотрим следующую строку:

ab

Образец (ab.*) вернет совпадение для группы захвата с результатом ab

Пока шаблон (ab.+) не будет соответствовать и ничего не возвращать.

Но если вы измените строку на следующую, она вернет aba для шаблона (ab.+)

aba
3
ответ дан wajatimur 22 August 2018 в 22:45
поделиться

+ соответствует хотя бы одному символу

* соответствует любому числу (включая 0) символов

. ? указывает ленивое выражение, поэтому оно будет соответствовать как можно меньше символов.

6
ответ дан Xophmeister 22 August 2018 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: