2016-01-23 61 views
0

我一直在练习正则表达式,并遇到了这个问题。The?匹配器vs模式|空

比赛:

  • 战斧
  • 劈斧

我用来到了一个解决方案:

(battle|splitting|pick)(\s|)axe 

建议的解决方案是:

(battle|splitting|pick)\s?axe 

在我最初的解决方案中,“OR”运算符是如何工作的?当我在没有两个表达式的JavaScript中运行标准的OR运算符时,它会引发错误。

是:

(pattern|) 

等同于:

pattern? 

如何(pattern|)在我的第一个解决方案的工作?

+3

除了回答你的问题,建议的解决方案是相当令人费解,因为它匹配“战斧”“splittingaxe”和“镐”以及。我认为'(战斗)挑战'是更可取的。 – TAGraves

+0

拼图的其他解决方案是'/ [\ w] + []?ax/g','/.+ []?ax/m'。 – 2016-01-23 21:30:12

回答

1

在我最初的解决方案中,“OR”运算符是如何工作的?当我在没有两个表达式的JavaScript中运行标准的OR运算符时,它会引发错误。

正则表达式运算符不是像||这样的JS运算符。空字符串是一个有效的正则表达式,可以作为Alternation operator的操作数。

(pattern|)相当于pattern?

不完全是,有一个在第一个附加capturing group。但是他们在匹配语言方面的工作是一样的,是的。

+0

请注意,如果'pattern'包含不止一个字符, '(abc |)'不等于'abc?'。 – Tushar

+0

这就是为什么我将*'pattern' *以斜体表示 - 它必须是单个[Alternative](http://www.ecma-international.org/ecma-262/6.0/#sec-alternative)表达式第一个和[Atom](http://www.ecma-international.org/ecma-262/6.0/#sec-term),即使在第二个,是的。 – Bergi

+0

/abc?/是“ab”或“abc”... –