Javascript:仅当它是文本的第一个单词时才替换“x”,而不是其他任何地方

Posted

技术标签:

【中文标题】Javascript:仅当它是文本的第一个单词时才替换“x”,而不是其他任何地方【英文标题】:Javascript: Replace 'x' only if it is the first word of a text, not anywhere else 【发布时间】:2017-06-04 22:05:03 【问题描述】:

我正在编写一个简单的 JS 代码,以使用数组将文本中的某些单词替换为其他单词。

<textarea id="text1">
e mi e
ke fo
e di
</textarea>
<button  type="button" onclick="myFunction()">try</button>
<pre id="demo"></pre>

<script>
function myFunction() 
   var str = document.getElementById("text1").value; 
    var mapObj = 
        "k":"g",
        " e": "B",
        "e":"ar"
    ;

    var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
    str = str.toLowerCase().replace(re, function(matched)
    return mapObj[matched];
    );
    document.getElementById("demo").innerhtml = str;

</script>

结果是:

ar mi B
gar fo
ar di

但我想拥有这个:

B mi B
gar fo
B di

如果"e"s 要在" e"s 之前更改(e 之前有一个空格),那么" e"s 将不是" e" 而是“ar”,所以在数组中,我把" e" 放在"e" 上面,效果很好。 然而问题是文本可能包含一个分隔的"e" 作为整个文本的第一个单词,或者作为一行的第一个单词,之前没有空格。在这种情况下,如何将这个分隔的 "e" 替换为 "B" 并防止它被替换为 "ar"

【问题讨论】:

有点困惑(也许只有我一个人),能否请您添加一个说明问题的示例?您给出的示例给出了我猜想要的输出 【参考方案1】:

试试下面的代码。

function myFunction() 
   var str = document.getElementById("text1").value; 
    str = str.toLowerCase().split('k').join('g').split(' e').join(' B').split('\\n').join(' B').split('e').join('ar');
    document.getElementById("demo").innerHTML = str;

这是一种不同的方法,但我得到了预期的输出。

【讨论】:

我已将此代码 sn-p 保存在 JS fiddle 中。 https://jsfiddle.net/9k2khb0x/【参考方案2】:

一个简单的解决方法。

<script type="text/javascript">
var myfunction = function()

  var f = document.getElementById('text1').innerHTML;
  var c = f.replace(/e/ig,'ar').replace(/\bar/ig,'B').replace(/k/ig,'g');
  document.getElementById('text1').innerHTML = c;


</script>

【讨论】:

【参考方案3】:

这行得通。

<textarea id="source" cols="5" rows="5">
e mi e
ke fo
e di
</textarea>

<button  type="button" onclick="convert()">Convert</button>

<textarea id="destination" cols="5" rows="5">
</textarea>

<script>
function replaceWord(searchFor, replaceWith, paragraph) 
    if (paragraph) 
        var lines = paragraph.split('\n');
        for (lineNo = 0; lineNo < lines.length; lineNo++) 
            var words = lines[lineNo].split(' ');
            for (wordNo = 0; wordNo < words.length; wordNo++) 
                if (words[wordNo] === searchFor) 
                    words[wordNo] = replaceWith;
                
            
            lines[lineNo] = words.join(' ');
        

        paragraph = lines.join('\n');
    

    return paragraph;


function replaceWords(wordMap, paragraph) 
    for(var searchFor in wordMap)
    
        if(wordMap.hasOwnProperty(searchFor))
        
            paragraph = replaceWord(searchFor, wordMap[searchFor], paragraph);
        
    
    return paragraph;


function convert() 

    var mapObj = 
        "ke":"gar",
        "e": "B"
    ;

    var source = document.getElementById("source");
    var destination = document.getElementById("destination");

    destination.value = replaceWords(mapObj, source.value);

</script>

这里是 jsFiddle。 https://jsfiddle.net/1egs7zgc/

就其价值而言,您的 mapObj 并不是真正的数组,而是一个对象。

【讨论】:

【参考方案4】:

您当前代码的问题是.replace 函数只接受一个变量输入。这限制了您在替换中使用更具体的正则表达式,因为匹配的元素将不匹配正则表达式。

.replace 的功能选项提供对匹配组的访问,如1+nth variables。因此,我们可以利用它在数组中查找替换字符串。

通过使用 RegExp 组,我们可以捕获我们正在寻找的值并根据需要替换它们。

JS

var myFunction = function() 
    var str = document.getElementById("text1").value;
    var regexs = ['(k)','(^e|\\se)', '(e)'];
    var replacers = ['g', 'B', 'ar'];
    var re = new RegExp(regexs.join("|"),"gi");
    // you would need to add variables to the function for each matching group you add (currently there are 3 so we have 3 groups)
    str = str.toLowerCase().replace(re, function(raw, group0, group1, group2)
        if(typeof group0 !== "undefined")
            return replacers[0]; // replaces with 'g'
        else if(typeof group1 !== "undefined")
            // skip over the first character (white space) and concatenate the replacement
            return raw[0] + replacers[1]; // replaces with 'B'
        else if(typeof group2 !== "undefined")
            return replacers[2]; // replaces with 'ar'
        
        return raw;
    );
    document.getElementById("demo").innerHTML = str;
;
document.getElementById('go').addEventListener('click', myFunction);

CSS

#demo
    white-space:pre;

注意:因为您输出到元素.innerHTML 没有上述CSS 新行不会显示。

JS FIDDLE

【讨论】:

以上是关于Javascript:仅当它是文本的第一个单词时才替换“x”,而不是其他任何地方的主要内容,如果未能解决你的问题,请参考以下文章

仅当它是所需类型时才绑定到接口(否则使用回退)?

仅当它不存在时才在 SQLite 中创建表

仅当它在 AngularJs 中有值时才需要下拉

仅当它在 Pig 中的内部引号(“”)时才替换逗号(,)

添加 www 的 htaccess 条件。仅当它在 url 中不包含字符串时才到 url

仅当没有给定前缀具有任意数量的空格时才匹配单词