如何在“猪拉丁”功能中排除标点符号?

时间:2018-06-20 15:13:44

标签: javascript regex

如果这个问题在某处得到回答,我深表歉意。如果是,请指出正确的方向。我已经阅读了很多解决方案,但还没有破解!

太...基本上,我需要: 将每个单词的第一个字母移到单词的末尾,然后在单词的末尾添加“ ay”。保留标点符号不变。

到目前为止,这是我的代码:

function pigIt(str) {
  var newStr = str.split(" ");

  var changed = newStr.map(function(input) {
    return input.substring(1) + input.charAt(0) + "ay";
  });

  changed = changed.join(" ");
  return changed;
}

console.log(pigIt('Pig latin is cool'));

如您所见,该代码适用于任何不包含标点符号的输入。大。现在,我可能需要在某个地方添加一个正则表达式以排除标点符号,但我不知道将其放在何处!请帮忙!

2 个答案:

答案 0 :(得分:2)

在捕获分隔符时,可以按单词边界/(\W+)/进行分隔。仅转换单词。然后再加入。

function pigIt(str) {
  var newStr = str.split(/(\W+)/); // ['Pig', ' ', 'latin', ',- ',..]

  var changed = newStr.map(function(input) {
    if (!/\w/.test(input)) return input // keep non word elements as is
    
    return input.substring(1) + input.charAt(0) + "ay";
  });

  return changed.join("");
}

console.log(pigIt('Pig latin,- is cool!'));

答案 1 :(得分:0)

我认为,因为您将要在处理后将标点符号放回原处,那么最好手动进行所有操作。

一次输入1个字符,并构建一个“字缓冲区”,每次您击中一个非字母字符,然后处理该字缓冲区并附加该非字母字符。

    function pigIt(str) {
      var process = function(s) {
        if (s.length < 2) {
          return s;
        }
        return s.substring(1) + s.charAt(0) + "ay";
      };
      var result = '';
      var buffer = '';
    
      for (var i = 0; i < str.length; i++) {
        var c = str[i];
    
        if (c.match(/[a-zA-Z]/i)) {
          buffer += c;
        } else {
          if (buffer.length) {
            result += process(buffer);
            buffer = '';
          }
          result += c;
        }
      }
    
      result += process(buffer);
      buffer = '';
    
      return result;
    }
    
    var output = pigIt('Pig latin is cool.');
    console.log(output);