我的目的是建立一个简单的过程,我可以用这个过程将单词分成音节。方法是在元音发生时分割单词。然而,问题是当辅音没有跟随元音时,在这种情况下,分裂发生在该辅音。
我的测试用例如下:
hair = ["hair"]
hairai = ["hai", "rai"]
hatred = ["hat", "red"]
在第一个例子中,头发是一个音节,因为最后的辅音后面没有元音,类似地,在最后一个例子中," t"接下来是一个r,所以应该考虑" ha"作为一个音节。 在第二个例子中,ai被认为是一个元音,所以hai将成为一个音节。
更多例子包括
father = ["fat", "her"]
kid = ["kid"]
lady = ["la","dy"]
请注意,我使用的是简单的例子,因为ENglish语言在声音方面非常复杂
我的代码如下
function syllabify(input) {
var arrs = [];
for (var i in input) {
var st = '';
var curr = input[i];
var nxt = input[i + 1];
if ((curr == 'a') || (curr == 'e') || (curr == 'i') || (curr == 'o') || (curr == 'u')) {
st += curr;
} else {
if ((nxt == 'a') || (nxt == 'e') || (nxt == 'i') || (nxt == 'o') || (nxt == 'u')) {
st += nxt;
} else {
arrs.push(st);
st = '';
}
}
}
console.log(arrs);
}
syllabify('hatred')

但是,我的代码甚至没有返回字符串。我做错了什么?
答案 0 :(得分:2)
您的代码存在许多问题:
st
设置为空字符串。这意味着你永远不会累积任何字母。你可能想要上面那行,在循环之外。i in input
遍历字母索引。在JavaScript中,in
关键字为您提供对象的键作为字符串。所以你得到字符串,而不是数字,加上字符串上定义的一些方法的名称。请改为var i = 0; i < input.length; i++
。currentSyllable
代替st
,syllables
代替arrs
等等。if
- else
- if
,而不是嵌套的else if
- else
。isVowel(letter)
而不是。使用regular expressions!以下是您在正则表达式中表达的音节的定义:
[^aeiouy]*
[aeiouy]+
[^aeiouy]*$
[^aeiouy](?=[^aeiouy])
你们一起得到这个:
/[^aeiouy]*[aeiouy]+(?:[^aeiouy]*$|[^aeiouy](?=[^aeiouy]))?/gi
您可以在行动here中看到它。要在JavaScript中运行它,请使用match
函数:
const syllableRegex = /[^aeiouy]*[aeiouy]+(?:[^aeiouy]*$|[^aeiouy](?=[^aeiouy]))?/gi;
function syllabify(words) {
return words.match(syllableRegex);
}
console.log(['away', 'hair', 'halter', 'hairspray', 'father', 'lady', 'kid'].map(syllabify))
&#13;
请注意,这对于没有元音的单词不起作用。您可能需要修改正则表达式以适应该情况,或者执行其他一些解决方法。
答案 1 :(得分:0)
我对RegEx的态度很虚弱,尽管在大多数情况下,安德斯(Anders)示例是正确的,但我确实发现了一些例外。到目前为止,这是我发现可以使用的功能(但是我敢肯定,还有其他例外情况尚未发现)。我相信它可以被艺术大师进行RegEx认证。此函数返回一个音节数组。
function getSyllables(word){
var response = [];
var isSpecialCase = false;
var nums = (word.match(/[aeiou]/gi) || []).length;
//debugger;
if (isSpecialCase == false && (word.match(/[0123456789]/gi) || []).length == word.length ){
// has digits
response.push(word);
isSpecialCase = true;
}
if (isSpecialCase == false && word.length < 4){
// three letters or less
response.push(word);
isSpecialCase = true;
}
if (isSpecialCase == false && word.charAt(word.length-1) == "e"){
if (isVowel(word.charAt(word.length-2)) == false){
var cnt = (word.match(/[aeiou]/gi) || []).length;
if (cnt == 3){
if (hasDoubleVowels(word)){
// words like "piece, fleece, grease"
response.push(word);
isSpecialCase = true;
}
}
if (cnt == 2){
// words like "phase, phrase, blaze, name",
if (hasRecurringConsonant(word) == false) {
// but not like "syllable"
response.push(word);
isSpecialCase = true;
}
}
}
}
if (isSpecialCase == false){
const syllableRegex = /[^aeiouy]*[aeiouy]+(?:[^aeiouy]*$|[^aeiouy](?=[^aeiouy]))?/gi;
response = word.match(syllableRegex);
}
return response;
}