在某些字符内匹配相同的字符串两次

时间:2018-04-02 15:23:26

标签: regex

我需要编写一个匹配这样的模式的正则表达式:

add_months_2 <- function(dt, n_months, month_days) {
  dt[, year := StartDate %/% 10000][
    , month := (StartDate - year * 10000) %/% 100][
    , day := StartDate %% 100][
    , new_month := c(1:12, 1:3)[month + n_months]][
    , leap_year := (!(year %% 4) & (year %% 100)) | !(year %% 400)][
    , max_d := (month_days + leap_year * c(0, 1, rep(0, 10)))[new_month]][  
    , StartDate_PlusM := year * 10000 + new_month * 100 + pmin(day, max_d)]
  dt
}

在该特定语法中,它是两次相同的字符串(我不想匹配括号本身)。我设法想出了这个:

[[string|string]]

然而,由于某些原因,它不匹配,我不明白我的错误在哪里。

更新:事实证明它不起作用,因为我的代码很脏并且第一个字符串中有一些●字符,因此两个字符串都不相等:https://regexr.com/3n7ni

删除那些无关的字符使正则表达式匹配,虽然它仍然需要调整(比如不匹配闭包括号):https://regexr.com/3n7o7

3 个答案:

答案 0 :(得分:1)

要匹配完整模式,您可以更新正则表达式以包含前两个括号:

\[\[(.*)\|\1\]\]

我认为你也可以没有这种积极的前瞻(?=\|)

答案 1 :(得分:1)

See regex in use here

\[{2}([^|\]]+)\|\1]{2}
  • \[{2}按字面意思匹配[,两次
  • ([^|\]]+)|]以外的任何字符中的一个或多个捕获到捕获组1中
  • \|按字面意思匹配|
  • \1将最近捕获的文本与捕获组1匹配
  • ]{2}按字面意思匹配],两次

答案 2 :(得分:0)

你的问题是使用贪婪的匹配(.*)(消耗尽可能多)。你应该使用不情愿的匹配(.*?)(消耗尽可能少):

\[\[(.*?)\|\1\]\]

请参阅live demo

请注意,您的向前看(?=\|)无用。