Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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 除了最后一个带有正则表达式的模式外,如何删除重复的模式?_Javascript_Regex - Fatal编程技术网

Javascript 除了最后一个带有正则表达式的模式外,如何删除重复的模式?

Javascript 除了最后一个带有正则表达式的模式外,如何删除重复的模式?,javascript,regex,Javascript,Regex,你好 我想知道是否可以使用RegExp实现,如果可以,如何实现 问题是: 在一个字符串中,我有多个与颜色对应的图案: {r for dark red {R for bright red {G for bright green {W for white {* for black ... and so on... 有时,我正在解析的数据包含很多无用的颜色变化 例如: {r{g此文本最终为绿色 var foo = "{r{Gthis text is green".replace(/^{(.+){/,

你好

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

问题是:

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

{r for dark red
{R for bright red
{G for bright green
{W for white
{* for black
... and so on...
有时,我正在解析的数据包含很多无用的颜色变化 例如:

{r{g此文本最终为绿色

var foo = "{r{Gthis text is green".replace(/^{(.+){/, '{');
console.log(foo);
{r
在那里是完全无用的。如果字符串是
{rSomething{g,那么它就不会了。这个文本最终是绿色的

var foo = "{r{Gthis text is green".replace(/^{(.+){/, '{');
console.log(foo);
我想找到一种方法来匹配在任何其他
{
之前的每个
{
,并保留最后一个

{r{g此文本为绿色
->
{g此文本为绿色
那文本是{R{rdark red
->
那文本是{rdark red

这样做容易吗

我知道这个问题非常特殊,可能永远也帮不了别人

但我真的很感激你的帮助

谢谢大家!

PS:这些代码用于Javascript,因此如果可能,我希望有一个使用Javascript的解决方案

编辑:


我必须能够在我的头顶上做这个te{*xt{Y{Y{Y{Y{Y}是绿色的,然后得到这个te{*xt{Y{Y{Y}是绿色的

,然后我会使用类似于
([\{a-zA-Z]{2})([{a-zA Z\]+)
var foo = "{r{Gthis text is green".replace(/^{(.+){/, '{');
console.log(foo);

我给出的正则表达式不够简洁,但这取决于您如何更好、更具体地满足您的需求。请尝试使用类似于正则表达式buddy的东西来帮助进一步的开发。

如果您想在字符串中也允许
{
,如果它后面没有一个特殊字符,请使用此选项:

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"

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

// 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,"{");

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

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

    var str = "{r{G{ythis text is finally green";
    var result = str.replace(/(\{[^\{])+(\{[^\{])/g, "$2");
    
    或者只允许alpha字符作为颜色代码字符,应该是这样的:

    var result = str.replace(/(\{[a-zA-Z])+(\{[a-zA-Z])/g, "$2");
    
    您可以在此处看到测试小提琴:

    您可以这样做:

    var模式={
    r:功能(a){
    //深红色实现
    返回“+a+”;
    },
    G:职能(a){
    //绿色实施
    返回“+a+”;
    }
    };
    var str='{rTesting{GTesting}}',匹配;
    而(match=str.match(/{([^{}]+)}/){
    str=str.replace(匹配[0],模式[match[1]。切片(0,1)](匹配[1]。切片(1)))
    }
    
    您尝试过什么(换句话说,发布到目前为止的Javascript)这几乎可以正常工作。但是当使用:
    {Y{r{g这个te{*xt{Y{yis green
    ->
    {yis green