2013-05-22 2 views
1

Я уверен, что это дубликат, но не может найти нужный критерий поиска.regex как извлечь строки между разделителями, а не двойные разделители

В принципе, у меня есть строка, снабженная пользователем с ключевыми словами, заключенными в фигурные скобки. Я хочу, чтобы регулярное выражение находило ключевые слова, но игнорировало бы двойные наборы разделителей.

пример: «Кошка в {{шляпе}} не укусит {назад}."

Мне нужно регулярное выражение, которое вернет {назад}, но не {hat}.

Это для C#.

ответ

2

Это то, что вы ищете

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

Мне нравится, как это чисто. –

+0

@ChaseFlorell спасибо ... – Anirudha

+0

Отличное спасибо! – StuTheDog

1

Описание

Попробуйте это, это потребует открытия и закрытия скобки, чтобы быть единичными. Двойные скобки будут проигнорированы.

Смотрите также это permlink example

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

enter image description here

C# пример

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 
     ) 

) 
+0

Я не вижу его. http://regexr.com?34v0i –

+0

Использует ли ваша ссылка код C#? См. Мою включенную ссылку или используйте http://www.myregextester.com/ –

+1

Действительно, я понимаю, о чем вы говорите. (+1) –

1

Ответ будет немного меняться в зависимости от того, регулярное выражение парсер вы используете, но что-то вроде следующего вероятно, вы хотите:

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

Non "{" (не часть матча), а затем "{" (захват) всех не "}" символов (конец перехвата), после "}", или ...

«{», а затем «{» (захват) всех символов «}» (конечный захват), за которым следует не «}» (не входит в совпадение), или ...

Начальный этап следования «{» (захват) всех символов «}» (конечный захват), за которым следует конец строки

Обратите внимание, что некоторые парсеры могут не распознавать оператор «?:», а некоторые парсеры могут потребовать, чтобы некоторые или все следующие символы (если не внутри "[]") - обратная косая черта с экранированием: {}() |

+0

этот работает, но он немного более запутан, чем @ Anirudh's –

+0

. Сложность позволяет «{{hat} и {boot}}" соответствовать как "{hat}", так и {{boot} "и строка, состоящая исключительно из замены «{шляпа]», которая все еще должна быть сопоставлена. Однако, если вам гарантировано, что вы никогда не увидите замену на своей собственной линии и что вы никогда не увидите совпадение, предшествующее «{», если оно также не предшествует «}», тогда есть гораздо более простые решения, которые вы можете использовать. –

0

Не слишком жесткий используется только помощник Regex:

(?:[^{]){([^}]*)}|{([^}]*)}(?:[^}])|^{([^}]*)}$ 
Смежные вопросы