正则表达式如何在分隔符之间提取字符串而不是双分隔符

时间:2013-05-22 01:32:25

标签: c# regex

我确定这是重复但无法找到正确的搜索条件。

基本上我有一个用户提供的字符串,其中的关键字用大括号括起来,我想要一个能找到关键字的正则表达式,但会忽略两组分隔符。

示例:“{{hat}}中的猫不咬{后退}。”

我需要返回{back}而不是{hat}的正则表达式。

这是针对C#。

4 个答案:

答案 0 :(得分:2)

这就是你要找的东西

(?<!\{)\{\w+\}(?!\})

答案 1 :(得分:1)

描述

试试这个,这需要打开和关闭括号是单一的。双括号将被忽略。

另见permlink example

[^{][{]([^}]*)[}][^}]

enter image description here

c#example

using System;
using System.Text.RegularExpressions;
namespace myapp
{
  class Class1
    {
      static void Main(string[] args)
        {
          String sourcestring = "A cat in a {{hat}} doesn't bite {back}.";
          Regex re = new Regex(@"[^{][{]([^}]*)[}][^}]");
          MatchCollection mc = re.Matches(sourcestring);
          int mIdx=0;
          foreach (Match m in mc)
           {
            for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
              {
                Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
              }
            mIdx++;
          }
        }
    }
}

$matches Array:
(
    [0] => Array
        (
            [0] =>  {back}.
        )

    [1] => Array
        (
            [0] => back
        )

)

答案 2 :(得分:1)

答案会因您使用的正则表达式解析器而略有不同,但以下内容可能与您的需求相似:

(?:[^{]){([^}]*)}|{([^}]*)}(?:[^}])|^{([^}]*)}$

非“{”(不是匹配的一部分)后跟“{”(捕获)所有非“}”字符(结束捕获),后跟“}”,或者......

“{”后跟“{”(捕获)所有非“}”字符(结束捕获),然后是非“}”(不是匹配的一部分),或者......

开始后跟“{”(捕获)所有非“}”字符(结束捕获),然后是行尾

请注意,某些解析器可能无法识别“?:”运算符,并且某些解析器可能要求以下部分或全部字符(当不在“[]”内部时)反斜杠转义:{}()|

答案 3 :(得分:0)

使用正则表达式助手时不太难:

(?:[^{]){([^}]*)}|{([^}]*)}(?:[^}])|^{([^}]*)}$