据我所知,我们基本上想要计算元音或元音对,以及一些特殊情况。让我们从最后一行开始,它的作用是计算元音和元音对:
return word.match(/[aeiouy]{1,2}/g).length;
这将匹配任何元音或元音对。[...]
意味着一个字符类 http://www.regular-expressions.info/charclass.html,也就是说,如果我们逐个字符地遍历字符串,如果实际字符是其中之一,我们就会得到一个匹配项。{1, 2}
是的数量重复 http://www.regular-expressions.info/repeat.html,即这意味着我们应该精确匹配一个或两个这样的字符。
另外两行用于特殊情况。
word = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '');
此行将从单词末尾删除“音节”,它们是:
-
Xes(其中X不是以下任何一个 'laeiouy',例如'zes')
- ed
-
Xe(其中X不是以下任何一个 'laeiouy',例如'xe')
(我不太确定这背后的语法含义是什么,但我猜,单词末尾的“音节”,如“-ed”、“-ded”、“-xed”等,并不真正意味着什么。如此算。)
至于正则表达式部分:(?:...)
is a 非捕获组 http://www.regular-expressions.info/brackets.html。我想在这种情况下,这个小组是不是真的不重要非捕获;这仅意味着我们想要对整个表达式进行分组,但随后我们不需要返回引用它。但是,我们也可以使用捕获组(即(...)
)
The [^...]
是一个否定的字符类。这意味着匹配任何字符,但此处未列出任何字符。 (与上面提到的(非否定)字符类进行比较。)
管道符号,即|
, 是个交替 http://www.regular-expressions.info/alternation.html运算符,这意味着任何表达式都可以匹配。
最后,$
锚点匹配队伍的尽头 http://www.regular-expressions.info/anchors.html,或字符串(取决于上下文)。
word = word.replace(/^y/, '');
这行从单词的开头删除了“y”-s(开头的“y”可能不算作音节——我认为这是有道理的)。^
是匹配的锚点行的开头 http://www.regular-expressions.info/anchors.html,或字符串(参见$
上文提到的)。
注意:该算法仅在以下情况下有效word
确实包含一个单词。