R捕获支架内的弦

时间:2018-08-28 15:43:09

标签: r regex stringr

我试图解析一些我的国际象棋pgn数据,但是在捕获一个括号内的字符时遇到了一些麻烦。

testString <- '[Event \"?\"]\n[Site \"http://www.chessmaniac.com play free chess\"]\n[Date \"2018.08.25\"]\n[Round \"-\"]\n[White \"NothingFancy 1497\"]\n[Black \"JR Smith 1985\"]\n[Result \"1-0\"]\n\n1.'

#Attempt to just get who white is, which is inside a bracket [White xxx]

findWhite <- regexpr('\\[White.*\\]', tempString)

regmatches(tempString, findWhite)

stringr包似乎可以满足我的要求,但是我很好奇相同正则表达式的用法有何不同。我可以使用stringr,但我也想知道如何在base R中做到这一点。

library(stringr)
str_extract(tempString, '\\[White.*\\]')

2 个答案:

答案 0 :(得分:2)

如果您需要以[White开始并以]结尾的整个比赛,则可以使用

regmatches(testString, regexpr("\\[White\\s*[^][]*]", testString))
[1] "[White \"NothingFancy 1497\"]"

如果只需要双引号内的子字符串:

regmatches(testString, regexpr("\\[White\\s*\\K[^][]*", testString, perl=TRUE))
[1] "\"NothingFancy 1497\""

请参见regex demo

要去除双引号,可以使用类似的

regmatches(testString, regexpr('\\[White\\s*"\\K.*(?="])', testString, perl=TRUE))
[1] "NothingFancy 1497"

请参见another regex demoonline R demo

详细信息

  • \\[-一个[字符
  • White-文字子字符串
  • \\s*-超过0个空格
  • \\K-match reset operator丢弃到目前为止匹配的文本
  • [^][]*-除[]以外的0多个字符
  • .*(在另一个版本中)-尽可能匹配除换行符以外的任何0+字符
  • (?="])-一个正向超前查询,它与字符串内紧跟"]的字符串中的位置相匹配。

答案 1 :(得分:1)

在基数R中执行此操作的至少一种方法是使用var arr = [1, 2, 3, 4]; function isUniform(arr) { var store = arr[0]; var response = false; for (var i = 0; i < arr.length; i++) { if (arr[i] === store) { resonse = true; continue; } return response; } return response; } console.log(isUniform(arr));并仅保留所需的零件。

sub