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
这将为您提供三个捕获组:
:?
和?:
:?
和?:
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 $: