Поиск тегов регулярное выражение [дубликат]

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

Я хотел бы указать, что решение janosdivenyi добавление конечного [] в dt не всегда дает ожидаемые результаты (даже при использовании data.table 1.9.6 или 1.10.4), как я делаю ниже.

Приведенные ниже примеры показывают, что если dt - последняя строка в функции, которая получает желаемое поведение без присутствия конечного [], но если dt не находится в последней строке в функции, то для получения желаемое поведение.

В первом примере показано, что без конечного [] на dt мы получаем ожидаемое поведение, когда dt находится на последней строке функции

mydt <- data.table(x = 1:3, y = 5:7)

myfunction <- function(dt) {
  df <- 1
  dt[, z := y - x]
}

myfunction(mydt)  # Nothing printed as expected

mydt  # Content printed as desired
##    x y z
## 1: 1 5 4
## 2: 2 6 4
## 3: 3 7 4

Добавление конечного [] в dt дает неожиданное поведение

mydt <- data.table(x = 1:3, y = 5:7)

myfunction <- function(dt) {
  df <- 1
  dt[, z := y - x][]
}

myfunction(mydt)  # Content printed unexpectedly
##    x y z
## 1: 1 5 4
## 2: 2 6 4
## 3: 3 7 4

mydt  # Content printed as desired
##    x y z
## 1: 1 5 4
## 2: 2 6 4
## 3: 3 7 4

Перемещение df <- 1 после dt без конечного [] дает неожиданное поведение

mydt <- data.table(x = 1:3, y = 5:7)

myfunction <- function(dt) {
  dt[, z := y - x]
  df <- 1
}

myfunction(mydt)  # Nothing printed as expected

mydt  # Nothing printed unexpectedly

Перемещение df <- 1 после dt с конечным [] дает ожидаемое поведение

mydt <- data.table(x = 1:3, y = 5:7)

myfunction <- function(dt) {
  dt[, z := y - x][]
  df <- 1
}

myfunction(mydt)  # Nothing printed as expected

mydt  # Content printed as desired
##    x y z
## 1: 1 5 4
## 2: 2 6 4
## 3: 3 7 4
5
задан john Smith 17 February 2016 в 14:34
поделиться

1 ответ

Общей трюкой является использование техники захвата внутри неизведанного позитивного взгляда. Используйте это регулярное выражение с preg_match_all:

(?=(1....1))

См. regex demo

Значения находятся в $matches[1] :

$re = "/(?=(1....1))/"; 
$str = "001110000100001100001"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]);

См. ссылку lookahead :

Lookaround фактически соответствует символам, но затем отбрасывает совпадение, возвращая только результат: совпадение или не совпадает. Вот почему их называют «утверждениями». Они не потребляют символы в строке, а только утверждают, возможно ли совпадение.

Если вы хотите сохранить совпадение регулярного выражения внутри lookahead, вам нужно поместить скобки для скобок вокруг регулярного выражения внутри lookahead, вот так: (?=(regex)).

5
ответ дан Wiktor Stribiżew 23 August 2018 в 19:29
поделиться
Другие вопросы по тегам:

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