正则表达式在正则表达式测试器中工作正常,但在R中不起作用

时间:2015-02-20 07:27:35

标签: regex r

似乎我在这里遗漏了一些非常简单的东西,

我有一个正则表达式,可以在regex测试器中使用,但在R中使用时,它返回/匹配任何内容。

Regex showing 2 matches on regextester

在R中使用相同的正则表达式并不匹配任何内容 fails in 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

same issue with grep

1 个答案:

答案 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

等等。小步骤:)