似乎我在这里遗漏了一些非常简单的东西,
我有一个正则表达式,可以在regex测试器中使用,但在R中使用时,它返回/匹配任何内容。
在R中使用相同的正则表达式并不匹配任何内容
如果我将正则表达式分成两部分用于查找correlation-id而另一部分用于查找connection-id,它会在R中找到匹配项,无法理解为什么它们在联合使用时不能正常工作。
1。(?:\s+D\s+\d+\s+\d+\s+CORRELATION.*\=)([a-z0-9]+\_\w+)
2。(?:\s+D\s+\d+\s+\d+\s+CONNECTION.*\=)([A-Z]+)
要使其在此处可重现,请使用正则表达式和数据。
正则表达式:
(?:\s+D\s+\d+\s+\d+\s+CORRELATION.*\=)([a-z0-9]+\_\w+)(?:\s+D\s+\d+\s+\d+\s+CONNECTION.*\=)([A-Z]+)
对应的R代码
data <- readLines("data12.txt")
## Warning message:
## In readLines("data12.txt") : incomplete final line found on 'data12.txt'
check <- regexec("(?:\\s+D\\s+\\d+\\s+\\d+\\s+CORRELATION.*\\=)([a-z0-9]+\\_\\w+)(?:\\s+D\\s+\\d+\\s+\\d+\\s+CONNECTION.*\\=)([A-Z]+)",data)
matches <- regmatches(data, check)
数据:的
M 8000000 NADR 14273 18:17:33.22 STC35256 00000291 DSNT375I +HPN2 PLAN=DISTSERV WITH 024
D 024 00000291 CORRELATION-ID=db2jcc_appli
D 024 00000291 CONNECTION-ID=SERVER
D 024 00000291 LUW-ID=G93FF023.DB11.CDD5C8DE241F=29839
D 024 00000291
D 024 00000291 THREAD-INFO=SAPHPNDB:9.63.240.123:SAPHPNDB:db2jcc_application:DYNAMIC
D 024 00000291 :46835:*:*
D 024 00000291 IS DEADLOCKED WITH PLAN=DISTSERV WITH
D 024 00000291 CORRELATION-ID=db2jcc_appli
D 024 00000291 CONNECTION-ID=SERVER
D 024 00000291 LUW-ID=G93FF07C.EE5F.CDD5C82B2305=29799
D 024 00000291
D 024 00000291 THREAD-INFO=SAPHPNDB:9.63.240.33:SAPHPNDB:db2jcc_application:DYNAMIC:
D 024 00000291 46835:*:*
E 024 00000291 ON MEMBER HPN2
答案 0 :(得分:0)
我认为现在是时候讨论如何调试regex了。
Regextester很好!但是,您将始终在不同的环境中使用它,就像您目前一样。然后出现问题。
首先,使用grep或sub,它们的输出更直观。
其次,遇到问题时,找到非常小的正则表达式并使其正常工作。我举个例子:
# take one line of the text and see if you can find a symbol
> grep('D', 'D 024 00000291 CORRELATION-ID=db2jcc_appli')
[1] 1
# seems it works. now add a part of your regex and see if that works
> grep('\\s+D', 'D 024 00000291 CORRELATION-ID=db2jcc_appli')
integer(0)
# it doesn't! lets try with a different part
> grep('D\\s+', 'D 024 00000291 CORRELATION-ID=db2jcc_appli')
[1] 1
# this works. lets see what it actually matches by replacing with an asterix
> sub('D\\s+', '*', 'D 024 00000291 CORRELATION-ID=db2jcc_appli')
[1] "*024 00000291 CORRELATION-ID=db2jcc_appli"
# ok, I can see from this how far the \\s+ reaches
等等。小步骤:)