我不知道如何写这个问题的标题,因为这是一个多步骤的问题!

背景知识:我想结合自己在英国文学和语法方面的背景,对“喜欢繁育的”模因诗的热爱以及新兴的JavaScript知识来创建“喜欢繁育的”诗词生成器。

基本上,用户输入一个单音节的名称/名词,并根据该单词产生押韵诗。该第一位的逻辑如下:

  • 第一步:获取用户输入的
  • 第二步:找出用户输入的时间(实际上可能不需要此步骤)
  • 第三步:找到第一个元音(如果唯一的话,仅包括“y”
    元音-或者,如果是最后一个字母,则仅包含“y”)
  • 步骤四:选择所有字母,包括和之后
    元音
  • 第五步:将这些字母与可能的尾韵进行比较

  • 问题是,我不确定如何处理第三步和第四步。 (我对使用jQuery或javascript库的解决方案持开放态度,但是由于我仍然是初学者,因此除了从头开始编写纯JavaScript之外,我没有花太多精力去编写任何东西。

    注意:如果长度上限有帮助,则9个字符是有意义的,因为英语中最长的单音节单词为9个字母长。

    我的第一个想法是做一个条件语句,例如:
    var noun = document.getElementById('noun').value; // noun input by user
    var n = noun.str.length; // length of unknown word
    var place = 0
    var firstVow; // location of first vowel
    while (place < 10) {
    // can you even do nested while loops/conditionals like this?
        if (noun.charAt(place) == 'a' ||
            noun.charAt(place) == 'e' ||
            noun.charAt(place) == 'i' ||
            noun.charAt(place) == 'o' ||
            noun.charAt(place) == 'u'||
            noun.charAt(n) == 'y') {
               firstVow = noun.indexOf(place);}
        else {
            place++;
        }
    }
     var numSel = n - firstVow; // number of characters to select equals string length minus location of the first vowel
     var nounSel = noun.substr(firstVow, numSel); // selection to compare to end-rhymes
    

    从理论上讲(至少我认为-如果我错了,请纠正我),这使我发现第一次出现a / e / i / o / u / word-terminal-y然后拉用来比较各种韵律的子串...但是后来我迷路了。

    我正在编译可能的尾韵列表,但是我不确定如何将它们与子字符串进行比较(它们将是,尤其是拼写不同的字符串)。如果我为每种押韵的声音制作了一个变量,并使用了一个数组用于不同的拼写,是否有办法检查字符串是否与数组中的任何一个元素匹配?我试图尽可能避免使用具有一百或多个条件的条件语句。

    任何帮助或批评将是最欢迎的!

    编辑示例:

    我所说的“可能的韵末列表”的一些示例:
  • “ay”如“bay”:[ay,eigh,ei]
  • “i”,如“by”中一样:[y,eye,aye,ye]
  • “ah”如“saw”:[a,ah,aw]
  • “ot”,如“bot”中所示:[ot,ott,应当,aught]

  • 使用示例进行逻辑检查:
  • 前提条件:用户输入:“Scott”
  • 步骤1:获取用户输入[结果:“Scott”]
  • 步骤2:查找用户输入的长度[结果:5个字符长,又名位置0-4]
  • 步骤3:查找第一个元音的位置[结果:第一个元音在位置2处为“o”]
  • 步骤4:选择该元音之后的所有字母[结果:返回子串“ott”]
  • 步骤5:将子字符串与可能的尾韵/拼音进行比较(结果:返回与“ot”尾韵的变量匹配)
  • 步骤6:将第3、5和7行的终端单词选择限制为带有“ot”末韵的单词子集[NB:这将是已经用该韵律方案识别的单词的预选库]

  • 我的主要障碍是将选定的子字符串“ott”与我的可能的最终韵律进行比较。如果我这样编排韵:
    var ay = ["ay", "eigh", "ei"];
    var eye = ["y", "eye", "aye", "ye"];
    var ah = ["a", "ah", "aw"];
    var ot = ["ot", "ott", "ought", "aught"];
    

    然后可以检查子字符串是否匹配数组中的任何一个选项?那可能是我可以使用正则表达式的另一个地方吗?

    最佳答案

    为了获得结尾,您可以使用正则表达式,该表达式查找零个或多个元音,后跟一个元音或y,然后查找字符串的末尾;或者查找一组元音,后跟非元音,然后查找字符串的末尾。

    function getEnding(word) {
        return (word.match(/[aeiou]*[aeiouy]$|[aeiou]+[^aeiou]+$/) || [''])[0];
    }
    
    console.log(['scott', 'bay', 'by', 'saw', 'bot', 'uncaught'].map(getEnding));

    09-26 01:22
    查看更多