2015-07-10 112 views
-2

试图做一个功能,将英文单词转换成猪拉丁文。我的问题是当我检查第一个字母是否是元音时。我使用正则表达式来检查:if (str[0] === /[aeiou]/i)但它不起作用。我的正则表达式有什么问题,但我看看引用,它应该可以工作。我不知道发生了什么事。有人可以解释为什么我使用的正则表达式不起作用,什么是类似的工作解决方案?如果你运行下面的代码,它没有给出正确的结果,只是事先说。Javascript猪拉丁语正则表达式不工作

function translate(str) { 
    var tag = ""; 
    if (str[0] === /[aeiou]/i) { 
     tag = "way"; 
     return str + tag; 
    } 
    else { 
     var count = 0; 
     for (var i = 0; i< str.length; i++) { 
      if (str[i] !== /[aeiou]/i) 
       tag += str[i]; 
      else 
       break; 
      count = i; 
     } 
     console.log(count); 
     return str.slice(count + 1) + tag + "ay"; 
    }  
} 

因此,当我运行说translate(overjoyed)它应该返回“过度喜欢”。如果我运行translate(glove)它应该返回“oveglay”。

+3

你需要看一下再正则表达式的例子 - 你的代码是完全正确 –

+0

使用它们这不是你如何测试一个字符串反对正则表达式。试着在MDC上查找'String.Prototype.match()'。 – miken32

+1

也不需要正则表达式:'if(“aeiou”.indexOf(str [0])!= - 1){' – mplungjan

回答

1

你写的不是你使用正则表达式的方式。代码if (str[0] === /[aeiou]/i)测试str字符串数组的第一个元素是否为等于,并且是正则表达式:/[aeiou]/i。字符与类型不一样作为正则表达式,所以这样的比较将评估为false

认为正则表达式作为工具,可以用于搜索匹配的整个字符串数组(str所有,不只是str[0])。网络有很多很棒的例子,但是为了让你开始,你可以尝试使用str.search(regexp),它将返回第一个匹配(如果找到)或-1(如果不匹配)的索引。

那么你的代码变得(没有太多偏离原来的,并没有巧言令色或最佳):

function translate(str) { 
    var tag = ""; 
    var pos = str.search(/[aeiou]/i); // This is ONE way to use regular expressions. 
    if (pos == 0) { // First letter is a vowel. 
     tag = "way"; 
     return str + tag; 
    } else if (pos > 0) { // Some letter (not the first) is a vowel. 
     // Instead of the loop checking each element, we already know where 
     // the match is found: at position = pos. 
     console.log(pos); // Log the match position of the first vowel. 
     tag = str.slice(0, pos); // The string before the first vowel. 
     return str.slice(pos) + tag + "ay"; 
    } 
} 
+0

谢谢你花时间解释它。 – Darrell

+0

不客气 - 欢迎来到堆栈溢出!如果您发现这个帖子回答了您的问题,请将其标记为已接受的答案。这将有助于未来访问者提出类似的问题,并鼓励高质量的答案。 –

0

这工作

function pig(str) { 
    if (/^[aeiou]/i.test(str)) { 
     return str + 'way'; 
    } 
    else { 
     return str.replace(/^(.[^aeiou]+)([aeiou].*)$/i, "$2$1ay"); 
    } 
} 
console.log(pig('overjoyed')); 
console.log(pig('glove')); 
+0

thav为downvotes ...我如何使这个答案更有用?我的意思是,这是正确的,并教导正确使用正则表达式 –

+0

我没有downvote,但我猜测这是因为:1.你没有解释他的方法有什么问题,2.你给了“工作”代码没有关于你的方法的解释。 –

+0

是啊,我有时在挑选明显的东西和需要解释的东西之间奋斗 –

0

我知道这是老了,但我最近刚做了类似的事情在Ruby和我以为我会用JavaScript重写并提供它作为答案。

function translate(words) 
{ 
    return words.split(' ').map(function(word){ 
    return word.split(/\b([^a,e,i,o,u]{0,}qu|[^a,e,i,o,u]+)?([a,e,i,o,u][a-z]+)?/i).reverse().join('') + 'ay' 
    }).join(' ') 
} 

所以我在我的字符串words可以是一个单词或一个完整的句子。

我把它分解成一个单词数组,通过分割空格。

然后我使用map来运行该数组中每个单词的代码,在那里我使用我的正则表达式(我将在后面解释它)将它分割成第一个声音,如果它是任何东西除了元音和其他的词。

安静地说,分割实际上导致以下数组:["","qu","iet",""],并在单词aqua它在["",undefined,"aqua",""]结果。

我可以忽略那些未定义的和空字符串,但是因为当我们将它们连接在一起时,它们会被忽略。

所以在分解之后,我将数组反转,然后将它作为一个单词连接在一起(使用空字符串''加入它),然后将'ay'粘贴到结果字符串的末尾。

我们解释的正则表达式:

  • \b说,我们正在寻找一个单词的开始,它可以替代地^的字符串的开始。

  • ([^a,e,i,o,u]{0,}qu|[^a,e,i,o,u]+)?是一个可选的捕捉组,寻找第一个辅音,让我们进一步分解它。

  • 所以在其内,我们有两个替代方案,我们正在寻找,无论是[^a,e,i,o,u]{0,}qu[^a,e,i,o,u]+,第一个检查含有qu有或没​​有前一个非元音字符(所以qu从安静的第一声音,或SQU从正方形得到匹配而不是在u之前停止),第二个是在第一个元音之前检查所有非元音字母,如果在开始时没有qu。

    • 现在它([a,e,i,o,u][a-z]+)?即最后一部分是刚刚从第一个元音抓住作为那场比赛

我希望其余有人的地方发现这个有用的:)

0
function translatePigLatin(str) { 
    if(["a","e","i","o","u"].indexOf(str[0])!==-1){ 
     str+="way"; 
    }else{  
     while(["a","e","i","o","u"].indexOf(str[0])==-1){ 
      str+=str[0]; 
      str=str.slice(1); 
     } 
     str+="ay"; 
    }  
    return str; 
} 

translatePigLatin("glove"); 

这个作品: 1.检查字符串的第一个字母。如果字母是元音,那么我们很容易用“方式”完成单词 2.如果第一个字母不是元音,请删除第一个字母以结束。 重复循环,直到“第一个”字母是元音。 3.now弦已经改变,我们可以再添加一个字符串(“AY”)字符串的结束