Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:regexp以匹配未包含在自定义标记中的单词_Javascript_Regex - Fatal编程技术网

javascript:regexp以匹配未包含在自定义标记中的单词

javascript:regexp以匹配未包含在自定义标记中的单词,javascript,regex,Javascript,Regex,我需要匹配并替换未包含在字符串中的标记:$和$:中的所有出现的“word”。“word”旁边的标记中可能还有其他字符 那么,假设我有绳子 abc单词嘿:$my word$: 我需要将单词替换为字母;基本上,我希望获得以下字符串: abc字母嘿:$my word$: 用JavaScript实现这一点的最佳方法是什么 进一步资料: 标记不会嵌套。 字符串可能单独包含字符“:”和“$”。在这种情况下,它们应该被视为简单字符,而不是标记。我无法为此指定RegExp,因此这里有一种更重要的方法来实现这一点

我需要匹配并替换未包含在字符串中的标记
:$
$:
中的所有出现的“word”。“word”旁边的标记中可能还有其他字符

那么,假设我有绳子

abc单词嘿:$my word$:

我需要将
单词
替换为
字母
;基本上,我希望获得以下字符串:

abc字母嘿:$my word$:

用JavaScript实现这一点的最佳方法是什么

进一步资料:

标记不会嵌套。
字符串可能单独包含字符“:”和“$”。在这种情况下,它们应该被视为简单字符,而不是标记。

我无法为此指定RegExp,因此这里有一种更重要的方法来实现这一点-

var text=“abc word hey:$my word$:”;
var replace=函数(文本、模式、替换){
var部分=[];
//这将把字符串分成几个部分。那些有:$的部分我们将不得不继续并忽略
var splitByEnd=text.split(“$:”);
对于(i=0,l=splitByEnd.length;i

这将为您提供三个捕获组:

  • :?
    ?:
  • 自定义标记之间的内容
  • :?
    ?:
  • 然后,您需要对第一个和第三个捕获组执行常规的stringreplace,将
    word
    替换为
    letter

    第一组和第三组是可选的,以
    :?word?:另一个单词也将匹配

    var regex = /^(.+?)?(:\$.+?\$:)(.+?)?$/i;
    regex.exec('abc word hey :$ my word $:');  
    alert(RegExp.$1.replace("word", "letter") + RegExp.$2 + RegExp.$3.replace("word", "letter"));
    


    我能想到的是,没有简单的正则表达式

    您可以改为查找多个正则表达式

    var s1='abc-word-hey:$my-word$:def-word:$other-word$:word-ghi:$a-third-word$:jkl-word';
    var-s2;
    //开头的词
    s2=s1。替换(/^([^:$]*)单词/,“$1letter”);
    //词尾
    s2=s1。替换(/word([^:$]*)$/,“字母$1”);
    //中间有一个字
    s2=s1。替换(/(:[^$]*)单词([^$]*:)/g,“$1letter$2”);
    控制台日志(s2);
    

    请参见

    我不确定正则表达式是否适合这里的工作(解析器可能更合适),但我想一个简单的解决方案是删除标记所覆盖的位,替换所有单词,然后替换标记。与此类似的内容(不支持嵌套标记,但应该可以正常工作):


    你是怎么尝试的?出了什么问题?你能发布一个现场演示来重现这个问题吗?仅供参考,
    Javascript
    Java
    没有关系,所以不要用
    Java
    来标记
    Javascript
    问题。这对regex来说相当困难。最好编写一个小型解析器。标记是否可以嵌套,如
    lorem:$ipsum dolor:$sit$:amet$:
    ?询问代码的问题必须证明在解决实际问题时付出了最小的努力,包括尝试的代码和遇到的问题
    $
    不应该在regex中转义吗?@Thor84no
    $
    在字符集中,因此不需要它。您可以看到,它在JSFIDLE中工作。感谢您的尝试。我应该提到标记对可能多次出现,有些甚至可能不包含“word”。看起来您的代码只有在只有一个标记对的情况下才能工作。@user3173481实际上,我编写代码时希望您有多个:$,$:对。我刚刚检查了一个更复杂的字符串,它可以工作-假设您没有嵌套的标记。对不起,您是对的,也可以使用多个:$,$:对。非常感谢。有趣的方法,但它不能处理多个标记。
    ^(.+?)?(:\$.+?\$:)(.+?)?$
    
    var regex = /^(.+?)?(:\$.+?\$:)(.+?)?$/i;
    regex.exec('abc word hey :$ my word $:');  
    alert(RegExp.$1.replace("word", "letter") + RegExp.$2 + RegExp.$3.replace("word", "letter"));
    
    var line = 'abc word hey :$ my word $: word :$ my word $:';
    var tags = [];
    var index = 0;
    while (line.match(/:\$.*\$:/)) {
        var start = line.indexOf(':$');
        var end = line.indexOf('$:', start);
        var tag = line.substring(start, end + 2);
        line = line.replace(tag, '$tag' + index + '$');
        tags.push(tag);
        index++;
    }
    line = line.replace(/word/g, 'letter');
    for (var i = 0; i < tags.length; i++) {
        line = line.replace('$tag' + i + '$', tags[i]);
    }
    document.write('result ' + line)
    
    result abc letter hey :$ my word $: letter :$ my word $: