我试图解析一些我的国际象棋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.*\\]')
答案 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 demo和online 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