javascript正则表达式匹配字符串有和没有数字

时间:2015-03-29 21:11:48

标签: javascript regex

我使用正则表达式并不是很好,花两天时间尝试解决这个问题,当然在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行

抱歉我的英语不好,而不是我的母语

2 个答案:

答案 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);
    }
}

jsfiddle demo

如果输入为"@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);
}