如何使用正则表达式删除除最后一个之外的重复模式?

时间:2011-08-26 00:49:11

标签: javascript regex

美好的一天,

我想知道是否可以使用 RegExp ,如果可以,如何使用。

问题在于:

在字符串中,我有多个与颜色对应的图案:

{r for dark red
{R for bright red
{G for bright green
{W for white
{* for black
... and so on...

有时我正在解析的数据包含很多无用的颜色变化 例如:

{r{Gthis text is finally green

{r在那里完全无用。如果字符串是{rSomething {Gthis text is finally green

,则不会

我想要一种方法来匹配任何其他{<color references>之前的{<color references>,并留下最后一个{r{Gthis text is green

{Gthis text is green - &gt; That text is {R{rdark red That text is {rdark red - &gt; {Y{r{Gthis te{*xt {Y{yis green

这是一种简单的方法吗?

我知道这个问题非常特别,可能永远不会帮助其他任何人。

但帮助真的很感激。

谢谢!

PS:代码用于 Javascript ,所以如果可能的话,我想要一个在Javascript中运行的解决方案。

修改

我必须能够{Gthis te{*xt {yis green并获得{{1}}

6 个答案:

答案 0 :(得分:1)

这是一种有效的方法。它的工作原理如下:

  1. 搜索一个或多个颜色代码,然后使用其他颜色代码。
  2. 颜色代码被视为{,后跟除{之外的任何其他单个字符。如果只允许一组指定的颜色代码,或者有更多字符不允许使用颜色代码,那么这些代码也可以添加到正则表达式中,但是您没有指定其他信息。
  3. 单一颜色代码的正则表达式是:\{[^\{]。这是一个{,后跟任何不是{的单个字符。如果您希望它只是字母字符,则可以将其更改为:\{[a-zA-Z]
  4. 使用匹配中的子匹配将最后一个颜色代码替换为多个连续颜色代码。
  5. 即使一行中有两个以上的颜色代码,此技术也会删除除最后一个颜色代码之外的所有颜色代码。
  6. 此技术不会删除看起来像有效颜色代码的内容,例如{{
  7. 这适用于颜色代码中的任何字符,因为您看起来有一长串有效的单字符代码。但是,它可以防止{{它不会被视为颜色代码。

    var str = "{r{G{ythis text is finally green";
    var result = str.replace(/(\{[^\{])+(\{[^\{])/g, "$2");
    

    或者只允许字母字符作为颜色代码字符,就是这样:

    var result = str.replace(/(\{[a-zA-Z])+(\{[a-zA-Z])/g, "$2");
    

    你可以在这里看到一个测试小提琴:http://jsfiddle.net/jfriend00/jNXUz/

答案 1 :(得分:0)

var foo = "{r{Gthis text is green".replace(/^{(.+){/, '{');
console.log(foo);

答案 2 :(得分:0)

在我的脑海中,我会使用像([\{a-zA-Z]{2})([{A-Za-z\ ]+)这样的正则表达式,然后你将删除第1组,或者只提取第2组。

我给出的正则表达式并不尽可能简洁,但这取决于你做得更好,更能满足你的需求。尝试使用像regex buddy这样的东西来帮助进一步开发。

答案 3 :(得分:0)

如果你想在你的字符串中允许{,如果它没有跟随你的一个特殊字符,请使用此项:

var patts = ['\\{r', 
             '\\{R', 
             '\\{G',
             '\\{W',
             '\\{\\*'];
var str = '{r{GThis is a green string';
var patt = '(?:'+patts.join('|')+')';
str = str.replace(new RegExp(patt+'('+patt+')', 'g'), '$1');
// str === "{GThis is a green string"

答案 4 :(得分:0)

您可以搜索一个颜色代码紧跟另一个颜色代码的位置,然后删除第一个颜色代码,如下面的代码所示:

// if you want to list out all possible codes
"{r{Gthis text is finally green".replace(/{[rRGW\*]{/g,"{");

// if you want a generic any character after bracket match
"{r{Gthis text is finally green".replace(/{.{/g,"{");

答案 5 :(得分:0)

您可以这样做:http://jsfiddle.net/BdWt5/

var patterns = {
  r:function(a){
    // dark red implementation
    return '<span style=color:red>'+a+'</span>';
  },
  G:function(a){
    // green implementation
    return '<span style=color:green>'+a+'</span>';
  }
};

var str = '{rTesting{GTesting}}',match;

while(match = str.match(/{([^{}]+)}/)){
  str=str.replace(match[0],patterns[match[1].slice(0,1)](match[1].slice(1)))
}