Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 正则表达式,一对单词的第一个、第二个、第三个等出现之间的匹配_R_Regex - Fatal编程技术网

R 正则表达式,一对单词的第一个、第二个、第三个等出现之间的匹配

R 正则表达式,一对单词的第一个、第二个、第三个等出现之间的匹配,r,regex,R,Regex,我想找到一个与下面字符串中粗体文本匹配的正则表达式 “A1文本:XXX\r\n状态:No\r\n信息:YYYY\r\n UUU结束A2文本:BBB\r\n状态:是\r\n信息:VVVVV\r\n OOO结束A3 2020/2021” 我的问题是“Info”和“End”对之间的匹配。下面我的正则表达式匹配第一次出现的“Info”和最后一次出现的“End”之间的所有内容。我希望它匹配第一个“Info”和下一个“End”。之后是下一个“Info”和后面的“End” string <- "

我想找到一个与下面字符串中粗体文本匹配的正则表达式

“A1文本:XXX\r\n状态:No\r\n信息:YYYY\r\n UUU结束A2文本:BBB\r\n状态:\r\n信息:VVVVV\r\n OOO结束A3 2020/2021”

我的问题是“Info”和“End”对之间的匹配。下面我的正则表达式匹配第一次出现的“Info”和最后一次出现的“End”之间的所有内容。我希望它匹配第一个“Info”和下一个“End”。之后是下一个“Info”和后面的“End”

string <- "A1 text: XXX \r\n Status: No \r\n Info: YYYY \r\n UUUU End A2 text: BBB \r\n Status: Yes \r\n Info: VVV \r\n OOO End A3 2020/2021"

str_match_all(string, regex("text: *([^\\r\\n]+?)\\r\\n.*?Status: *([^\\r\\n]+?)\\r\\n.",
                           dotall=T))[[1]][,-1]

str_match_all(string, regex("(?<=Info)(.*)(?=End)",
                            dotall=T))[[1]][,-1]


I want a expression like this: 
str_match_all(string, regex("text: *([^\\r\\n]+?)\\r\\n.*?Status: *([^\\r\\n]+?)\\r\\n.*?(?<=Info)(.*)(?=End)",   dotall=T))[[1]][,-1]

to return this:

     [,1]   [,2]  [,3]
[1,] "XXX " "No " "YYYY \r\n UUUU"
[2,] "BBB " "Yes " "VVV \r\n OOO"


string您可以使用

字符串[,1][,2][,3]
#=>[1,]XXX“否”YYYY\r\n uuu
#=>[2,]“BBB”“是”“VVV\r\n OOO”
正则表达式是

(?s)文本:\h*(.*)\R\s*状态:\h*([^\R\n]*)\R\s*信息:\h*(.*)\s*结束\b
详情如下:

  • (?s)
    -内联dotall修饰符
  • 文本:
    -文字文本
  • \h*
    -0+水平空白
  • (.*)
    -第1组:任何零个或多个字符,尽可能少
  • \R
    -任何换行顺序
  • \s*
    -任何0+空格
  • 状态:\h*
    -
    状态:
    和0+水平空白
  • ([^\r\n]*)
    -第2组:除CR和LF之外的任何零个或多个字符
  • \R
    -任何换行顺序
  • \s*
    -任何0+空格
  • Info:\h*
    -
    Info:
    和0+水平空格
  • (.*)
    -第3组:任何零个或多个字符,尽可能少
  • \s*End\b
    -0+空格,
    End
    作为一个整体

谢谢!太棒了。有一个问题:为什么它可以使用,dotall=T))[[1]][,-1]?为什么我需要lappy?@Henrik
str_match\u all(string,“(?s)text:\\h*(?)\\R\\s*状态:\\h*(?)\\R\\s*信息:\\h*(?)\\s*End\\b][[1][,-1]
在我这方面效果很好。你重新分配了
T
吗?永远不要使用
T
,始终使用完整的
TRUE