Regex 挑战性正则表达式

Regex 挑战性正则表达式,regex,Regex,有以下格式的字符串: 它可以从任意数量的字符串开始,这些字符串由双大括号括起来,可能,它们之间有空格(空格可能出现,也可能不出现) 也可以包含中间用双括号括起来的字符串。 我正在寻找一个正则表达式,它可以将开始和其余部分分开 例如,给定以下字符串: {{a}}{{b}} {{c}} def{{g}}hij 这两部分是: {{a}}{{b}} {{c}} def{{g}}hij 我试过这个: /^({{.*}})(.*)$/ /^({{.*?}})(.*)$/ 但是,它也抓住了中间的g

有以下格式的字符串:

  • 它可以从任意数量的字符串开始,这些字符串由双大括号括起来,可能,它们之间有空格(空格可能出现,也可能不出现)
  • 也可以包含中间用双括号括起来的字符串。
我正在寻找一个正则表达式,它可以将开始和其余部分分开

例如,给定以下字符串:

{{a}}{{b}} {{c}} def{{g}}hij
这两部分是:

{{a}}{{b}} {{c}}
def{{g}}hij
我试过这个:

/^({{.*}})(.*)$/
/^({{.*?}})(.*)$/
但是,它也抓住了中间的g:

{{a}}{{b}} {{c}} def{{g}}
hij
我试过这个:

/^({{.*}})(.*)$/
/^({{.*?}})(.*)$/
但是,它只捕获了第一个a:

{{a}}
{{b}} {{c}} def{{g}}hij
我想我明白了:

var string = "{{a}}{{b}} {{c}} def{{g}}hij";

console.log(string.match(/((\{\{\w+\}\})\s*)+/g));

// Output: [ '{{a}}{{b}} {{c}} ', '{{g}}' ]
说明:

  • 启动一个组
  • 另一个
  • \{\w+\}
    查找
    {{A-Za-z\u 0-9}
  • 关闭第二组
  • \s*
    统计空白(如果有)
  • )+
    关闭第一个组并查找一次或多次出现的OIT
  • 当它获取任何
    not-{{something}
    类型数据时,它停止

    附言->

    我想我明白了:

    var string = "{{a}}{{b}} {{c}} def{{g}}hij";
    
    console.log(string.match(/((\{\{\w+\}\})\s*)+/g));
    
    // Output: [ '{{a}}{{b}} {{c}} ', '{{g}}' ]
    
    说明:

  • 启动一个组
  • 另一个
  • \{\w+\}
    查找
    {{A-Za-z\u 0-9}
  • 关闭第二组
  • \s*
    统计空白(如果有)
  • )+
    关闭第一个组并查找一次或多次出现的OIT
  • 当它获取任何
    not-{{something}
    类型数据时,它停止


    请注意->

    我不知道您想要拆分的确切原因,但是如果字符串中始终包含def,并且您想要将字符串从中拆分为两半,那么您可以尝试以下方法:

    string text = "{{a}}{{b}} {{c}} def{{g}}hij";
    
                Regex r = new Regex("def");
                string[] split = new string[2];
                int index = r.Match(text).Index;
                split[0] = string.Join("", text.Take(index).Select(x => x.ToString()).ToArray<string>());
                split[1] = string.Join("", text.Skip(index).Take(text.Length - index).Select(x => x.ToString()).ToArray<string>());
    
    string text=“{{a}}{{b}{{c}}def{{g}}hij”;
    正则表达式r=新正则表达式(“def”);
    字符串[]拆分=新字符串[2];
    int index=r.Match(text).index;
    拆分[0]=string.Join(“,text.Take(index).Select(x=>x.ToString()).ToArray());
    split[1]=string.Join(“,text.Skip(index).Take(text.Length-index).Select(x=>x.ToString()).ToArray());
    

    //输出:[{{a}{{b}{{c}',def{{g}}hij']

    我不知道您想要拆分的确切原因,但是如果字符串中始终包含def,并且您想要将字符串从那里分成两半,那么,您可以尝试以下方法:

    string text = "{{a}}{{b}} {{c}} def{{g}}hij";
    
                Regex r = new Regex("def");
                string[] split = new string[2];
                int index = r.Match(text).Index;
                split[0] = string.Join("", text.Take(index).Select(x => x.ToString()).ToArray<string>());
                split[1] = string.Join("", text.Skip(index).Take(text.Length - index).Select(x => x.ToString()).ToArray<string>());
    
    string text=“{{a}}{{b}{{c}}def{{g}}hij”;
    正则表达式r=新正则表达式(“def”);
    字符串[]拆分=新字符串[2];
    int index=r.Match(text).index;
    拆分[0]=string.Join(“,text.Take(index).Select(x=>x.ToString()).ToArray());
    split[1]=string.Join(“,text.Skip(index).Take(text.Length-index).Select(x=>x.ToString()).ToArray());
    
    //输出:[{{a}{{b}{{c}',def{{{g}}hij']

    使用:

    输出:

    Array
    (
        [0] => {{a}}{{b}} {{c}}
        [1] =>  def{{g}}hij
    )
    
    如何使用:

    输出:

    Array
    (
        [0] => {{a}}{{b}} {{c}}
        [1] =>  def{{g}}hij
    )
    

    这将保持匹配
    {
    、任何非
    {
    }
    字符1次或多次、
    }
    、可能的空白零次或多次,并将其存储在第一个组中。字符串的其余部分将在第二组中。如果没有被
    {{
    }
    包围的部分,则第一组将为空。这是用JavaScript编写的

    var str = "{{a}}{{b}} {{c}} def{{g}}hij";
    
    str.match(/^\s*((?:\{\{[^{}]+\}\}\s*)*)(.*)/)
    
    // [whole match, group 1, group 2]
    // ["{{a}}{{b}} {{c}} def{{g}}hij", "{{a}}{{b}} {{c}} ", "def{{g}}hij"]
    

    这将保持匹配
    {
    、任何非
    {
    }
    字符1次或多次、
    }
    、可能的空白零次或多次,并将其存储在第一个组中。字符串的其余部分将在第二组中。如果没有被
    {{
    }
    包围的部分,则第一组将为空。这是用JavaScript编写的

    var str = "{{a}}{{b}} {{c}} def{{g}}hij";
    
    str.match(/^\s*((?:\{\{[^{}]+\}\}\s*)*)(.*)/)
    
    // [whole match, group 1, group 2]
    // ["{{a}}{{b}} {{c}} def{{g}}hij", "{{a}}{{b}} {{c}} ", "def{{g}}hij"]
    
    您可以使用以下选项:

    (爪哇)

    (菲律宾)

    您可以使用以下选项:

    (爪哇)

    (菲律宾)


    大括号内的字符是否为字母数字(A-Za-z0-9)。是由非{{something}}字符定义的结束。并且将只有一个空格。@HighBoots字符串不必是字母数字。开始的结尾由不在{{}中的内容定义。可以有多个空格。大括号内的字符是字母数字(A-Za-z0-9)。是由非{{something}}字符定义的结束。并且将只有一个空格。@HighBoots字符串不必是字母数字。开始的结尾由不在{{}中的内容定义。可以有多个空格。“def”只是一个例子。。。。大括号内和括号之间的字符串可以是任何字符串。哦,好的!那就忘了我的回答:P谢谢你的信息!“def”只是一个例子。。。。大括号内和括号之间的字符串可以是任何字符串。哦,好的!那就忘了我的回答:P谢谢你的信息!我在PHP:preg_split(“/\\s+(?!{)/”,$mystr)中尝试过这个方法;它不起作用-我将整个示例字符串放在一个块中。@ErelSegalHalevi:对不起,你没有提到你在标记中使用的语言。要使它在PHP中起作用,请删除一个反斜杠。你是对的,它适用于这个字符串,但是,如果我删除“def”之前的单个空格,它返回单个块中的整个字符串。我在PHP中尝试过:preg_split(“/\\s+(?!{)/”,$mystr);它不起作用-我将整个示例字符串放在一个块中。@Erresegalhalevi:很抱歉,您没有提到用于标记的语言。要使其与php一起工作,请删除反斜杠。您是对的,它适用于这个确切的字符串,但是,如果我删除“def”之前的单个空格,它将在单个块中返回整个字符串。