【问题标题】:Replace letters with Words using JavaScript Regex使用 JavaScript 正则表达式将字母替换为单词
【发布时间】:2014-07-16 05:48:43
【问题描述】:

我正在制作需要语音表达的东西。目标是获取一个包含数字、字母和符号的随机字符串,然后用单词替换这些字母。我遇到了一个问题。

它不想将第一个和最后一个字母更改为单词。这是因为表达式/\sa\s/g(例如)搜索字母前后有空格的所有小写a 实例。

假设你有一个随机字符串h_OX%o2At

下面的代码返回h _ OSCAR XRAY % oscar 2 ALPHA t,但我希望它返回hotel _ OSCAR XRAY % oscar 2 ALPHA tango

代码如下:

phoneticExp.text(password.split("").join(" ").replace(/\sa\s/g, " alpha ").replace(/\sA\s/g, " ALPHA ").replace(/\sb\s/g, " bravo ").replace(/\sB\s/g, " BRAVO ").replace(/\sc\s/g, " charlie ").replace(/\sC\s/g, " CHARLIE ").replace(/\sd\s/g, " delta ").replace(/\sD\s/g, " DELTA ").replace(/\se\s/g, " echo ").replace(/\sE\s/g, " ECHO ").replace(/\sf\s/g, " foxtrot ").replace(/\sF\s/g, " FOXTROT ").replace(/\sg\s/g, " golf ").replace(/\sG\s/g, " GOLF ").replace(/\sh\s/g, " hotel ").replace(/\sH\s/g, " HOTEL ").replace(/\si\s/g, " india ").replace(/\sI\s/g, " INDIA ").replace(/\sj\s/g, " juliet ").replace(/\sJ\s/g, " JULIET ").replace(/\sk\s/g, " kilo ").replace(/\sK\s/g, " KILO ").replace(/\sl\s/g, " lima ").replace(/\sL\s/g, " LIMA ").replace(/\sm\s/g, " mike ").replace(/\sM\s/g, " MIKE ").replace(/\sn\s/g, " november ").replace(/\sN\s/g, " NOVEMBER ").replace(/\so\s/g, " oscar ").replace(/\sO\s/g, " OSCAR ").replace(/\sp\s/g, " papa ").replace(/\sP\s/g, " PAPA ").replace(/\sq\s/g, " quebec ").replace(/\sQ\s/g, " QUEBEC ").replace(/\sr\s/g, " romeo ").replace(/\sR\s/g, " ROMEO ").replace(/\ss\s/g, " sierra ").replace(/\sS\s/g, " SIERRA ").replace(/\st\s/g, " tango ").replace(/\sT\s/g, " TANGO ").replace(/\su\s/g, " uniform ").replace(/\sU\s/g, " UNIFORM ").replace(/\sv\s/g, " victor ").replace(/\sV\s/g, " VICTOR ").replace(/\sw\s/g, " wiskey ").replace(/\sW\s/g, " WISKEY ").replace(/\sx\s/g, " xray ").replace(/\sX\s/g, " XRAY ").replace(/\sy\s/g, " yankee ").replace(/\sz\s/g, " zulu ").replace(/\sZ\s/g, " ZULU "));

然后我尝试执行/(\s|\s?)a(\s|\s?)/g,它应该搜索小写的a,它的前面和后面都有一个空格或可选空格。那没用。

我很茫然。这是Fiddle

【问题讨论】:

    标签: javascript jquery regex string


    【解决方案1】:

    不要寻找被空格包围的字母,而是尝试寻找单词边界。比如……

    .replace(/\bh\b/g, "hotel")
    

    Fiddle

    【讨论】:

      【解决方案2】:

      您还需要在字符串的开头和结尾搜索锚点。对于每个字符,您需要执行以下操作:/(\s|^)a(\a|$)/g。我可能还会对开始/结束字符进行哈希处理并对其进行循环,这样您就不需要在五十多个地方进行这些更改!

      我在这里对 h 和 t 做了相应的修改,例如:http://jsfiddle.net/HGrV8/

      【讨论】:

        【解决方案3】:

        为什么不避免使用正则表达式,而改为这样做。

        Javascript

        var lookup = {
            a: 'alpha',
            b: 'bravo',
            c: 'charlie',
            d: 'delta',
            e: 'echo',
            f: 'foxtrot',
            g: 'golf',
            h: 'hotel',
            i: 'india',
            j: 'juliet',
            k: 'kilo',
            l: 'lima',
            m: 'mike',
            n: 'november',
            o: 'oscar',
            p: 'papa',
            q: 'quebec',
            r: 'romeo',
            s: 'siera',
            t: 'tango',
            u: 'uniform',
            v: 'victor',
            w: 'wiskey',
            x: 'xray',
            y: 'yankee',
            z: 'zulu',
        };
        
        function toPhonetic(text) {
            return text.split('').map(function (character) {
                var lower = character.toLowerCase(),
                    word;
        
                if (lookup.hasOwnProperty(lower)) {
                    word = lookup[lower];
                    if (character === lower) {
                        return word;
                    }
        
                    return word.toUpperCase();
        
                }
        
                return character;
            }).join(' ');
        }
        
        var password = $("#password").text(),
            phoneticExp = $("#phonetic");
        
        phoneticExp.text(toPhonetic(password));
        

        开启jsFiddle

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多