正则表达式搜索&取代多才多艺的lookbehind

时间:2018-04-11 09:32:19

标签: r regex sublimetext3

我有一个类似于此的R函数:

logFun <- function(msg1, msg2){
  return(sprintf("%s: %s", msg1, msg2))
}
logFun("123", "456")

它在很多地方使用过,并不总是很好地输入,例如这些都是示例用例:

var1 <- "aa"
var2 <- "bb"
logFun(var1, var2)
logFun("aa", var2)
logFun("aa", "bb")
logFun(var1, "bb")
logFun(msg1 = "aa", msg2 = "bb")
logFun(msg1 = var1, msg2 = "bb")
...

说我有一个新功能,例如

logFun2 <- function(msg1, msg2, type){
  return(sprintf("[%s] %s: %s", type, msg1, msg2))
}
logFun2("123", "456", "bug")

并且必须保留函数调用(msg1, msg2, type),因为许多函数已从logFun转换为logFun2。我试图用Sublime做的是用以下内容替换上面的用例列表:

logFun2(var1, var2, type = "bug")
logFun2("aa", var2, type = "bug")
logFun2("aa", "bb", type = "bug")
logFun2(var1, "bb", type = "bug")
logFun2(msg1 = "aa", msg2 = "bb", type = "bug")
logFun2(msg1 = var1, msg2 = "bb", type = "bug")

我已经阅读了一些关于lookbehind匹配的内容,但发现它是否是一个可行的工作,或者我是否应该找到问题的另一个解决方案。使用https://regex101.com/,我已设法将logFun(部分与(?<=logFun\()隔离,但不确定从何处开始。任何指导将不胜感激:)

谢谢,Jonny

修改1

问:为什么无法使用参数logFun2的默认值定义type = "bug"函数,只需将logFun替换为logFun2

答:实际上,我们并不只是logFun。我们说有函数logBuglogInfologWarning等等。然后我们将这些函数更改为单数函数logGeneral,例如logBug变为logGeneral(.., .., type = "bug")。 所以,你是对的,我们可以为一种类型的日志指定默认值而不用担心那个。

3 个答案:

答案 0 :(得分:1)

我不使用Sublime,但正则表达式可以隔离你的函数:

(\blogFun)(\b\(.*)\)

并替换:

$12$2, type = "bug")

答案 1 :(得分:1)

由于有多种类型,因此可以对所有类型使用正则表达式:

logFun2(\2, type = "\L\1") 

然后在“log”之后使用PCRE小写转换\ L替换类型名称。

替换字符串:

Private Sub CommandButton21_Click()

Dim index As Integer, lapsedSchemes As New Collection, lapseDates As New 
Collection
Dim iRow As Long
Dim iCol As Integer

Sheet1.Columns(5).NumberFormat = "dd-mmm-yy"                   
Sheet1.Columns(14).NumberFormat = "dd-mmm-yy"                   

iRow = 2

Do While Sheet3.Cells(iRow, 1).Value <> ""                      

    lapsedSchemes.Add Sheet3.Cells(iRow, 1).Value
    lapseDates.Add Sheet3.Cells(iRow, 2).Value
    iRow = iRow + 1

Loop

iRow = 2

Do While Cells(iRow, 7).Value <> ""                            

    index = 1

    If Cells(iRow, 9).Value = "" Then                           
        If Cells(iRow, 7).Value = Cells(iRow, 8).Value Then
           Cells(iRow, 9).Value = "Policy Holder"
        Else
           Cells(iRow, 9).Value = "Dependant"
        End If
    End If

    For Each scheme In lapsedSchemes                                                    

        If Cells(iRow, 4).Value = scheme And Cells(iRow, 5) = lapseDates(index) Then  
            Cells(iRow, 4).EntireRow.Delete                                            
            iRow = iRow - 1
            Exit For
        End If

        index = index + 1

    Next scheme

    iRow = iRow + 1

Loop

appendLegacyData (iRow)
Range("A1:AZ10000").Sort Key1:=Range("A1"), Order1:=xlAscending, Key2:=Range("D1"), Order2:=xlAscending, Key3:=Range("E1"), Order3:=xlAscending, Header:=xlYes

End Sub

测试here

Also this

答案 2 :(得分:1)

使用我用于你的案例的崇高:

查找: (logFun)(\(.+)\)

替换: \12\2, type = "bug")

如果您还有logBug, logInfo, logWarning(或甚至logDebug(paste("annoying", "case"), msg2 = "data_prep")),那么您只需修改查找部分:

查找: (log[A-Z][a-z]*)(\(.+)\)