我使用正则表达式并不是很好,花两天时间尝试解决这个问题,当然在stackoverflow中搜索解决方案,但没有解决我的问题。这就是问题所在。
使用此代码将得分变量增加1
@inc score
我们使用此正则表达式捕获变量
inc: /^@inc (.*)$/
这是参数
if (match.inc) {
section = this.addAttribute(match.inc[1] + '+=1', story, section, passage, isFirst, inputFilename, lineCount);
}
然后我尝试将它推进一点,就像这样
@inc score 15
我改变正则表达式
inc: /^@inc (.*)( )(.\d*)$/
并且该代码可以正常使用此更改
if (match.inc) {
section = this.addAttribute(match.inc[1] + '+=' + match.inc[3], story, section, passage, isFirst, inputFilename, lineCount);
}
我的问题是,正则表达式应该如何?如果我想保持两个工作
@inc score <----- will increase by 1
@inc score 100000 <----- will increase by number
当然应该如何论证?
这是实际代码link第197行和第299行
抱歉我的英语不好,而不是我的母语答案 0 :(得分:1)
我会使用此正则表达式^@inc (.*?)(?:(\s)(\d+))?$
您可以在此处查看https://regex101.com/r/dO6yN8/2。
在第一个捕获组中,它捕获所有内容,直到它看到一个空间(如果存在),由于某种原因你想要在第二个捕获组中,然后在第三组中的该空间之后捕获数字。但是空格和数字是可选的。
答案 1 :(得分:1)
我不完全确定你使用的语法(但是,我不习惯javascript ...),但是这里有一个小片段应该可以给你一些想法:
var scores = ["@inc score", "@inc score 100"];
var re = /@inc score(?: (\d+))?/;
for (i = 0; i < scores.length; i++) {
var inc = scores[i];
if (result = inc.match(re)) {
var addition = "+=" + (result[1] === undefined ? '1' : result[1]);
alert(addition);
}
}
如果输入为"@inc score"
,则结果为+=1
,当结果为"@inc score 1000"
时,结果为+=1000
。
(?: (\d+))?
匹配包含1个空格和至少1个数字的可选组。正在捕获数字,并且在尝试匹配时将是结果列表的第二个元素。这个元素是在条件/三元运算符上测试的。
编辑:糟糕,要使用score
作为要增加的变量,您可以使用相同的概念,构造略有不同:
var scores = ["@inc score", "@inc score 1000", "@inc amount 1000"];
var re = /@inc (\S+)(?: (\d+))?/;
for (i = 0; i < scores.length; i++) {
var inc = scores[i];
if (result = inc.match(re)) {
var addition = result[1] + "+=" + (result[2] === undefined ? '1' : result[2]);
alert(addition);
}
}
我想在你自己的代码中,应该是这样的:
inc: /^@inc (\S+)(?: (\d+))?$/
和
if (match.inc) {
section = this.addAttribute(match.inc[1] + '+=' + (match.inc[2] === undefined ? '1' : match.inc[2]), story, section, passage, isFirst, inputFilename, lineCount);
}