假设我有看起来像这样的文本字符串:
A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I2-I1-I1-I3-I3
在这里,我想识别标记序列(
A
是一个标记,I3
是一个标记等), 将 引导到包含 的子序列,只有 的 IX
标记(即 I1
, I2
,包含 I3
的 I3
,该子序列的长度可以为 1(即是单个 I3
标记),也可以是无限长度,但始终需要包含至少 1 个 I3
标记,并且只能包含 IX
标记。在通向 IX
子序列的子序列中,可以包含 I1
和 I2
,但不能包含 I3
。在上面的字符串中,我需要确定:
A-B-C-I1-I2-D-E-F
这导致包含
I1-I3
的 I3
子序列和
D-D-D-D
这导致包含至少 1 个
I1-I1-I2-I1-I1-I3-I3
的 I3
子序列。下面是一些额外的例子:
A-B-I3-C-I3
从这个字符串我们应该识别
A-B
因为它后面跟着一个包含 I3
的 1 子序列,还有 C
,因为它后面跟着一个包含 I3
的 1 子序列。和:
I3-A-I3
这里
A
应该被识别,因为它后面是包含 I3
的 1 子序列。第一个 I3
本身不会被识别,因为我们只对后面跟着包含 IX
的 I3
标记子序列的子序列感兴趣。如何编写完成此任务的通用函数/正则表达式?
最佳答案
使用 strsplit
> x <- "A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I2-I1-I1-I3-I3"
> strsplit(x, "(?:-?I\\d+)*-?\\bI3-?(?:I\\d+-?)*")
[[1]]
[1] "A-B-C-I1-I2-D-E-F" "D-D-D-D"
> strsplit("A-B-I3-C-I3", "(?:-?I\\d+)*-?\\bI3\\b-?(?:I\\d+-?)*")
[[1]]
[1] "A-B" "C"
或者
> strsplit("A-B-I3-C-I3", "(?:-?I\\d+)*-?\\bI3\\b-?(?:I3-?)*")
[[1]]
[1] "A-B" "C"
关于regex - 基于复杂规则识别子串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31449589/