2015-01-21 5 views
1

Простой вопрос здесь, ребята. Я пытаюсь создать шаблон для использования с Regex в C#.Картинка Regex с помощью скобок

Вот моя попытка:

"(value\":\[\[\"([A-Za-z0-9]+(?:-{0,1})[A-Za-z0-9]+)\"\]\])" 

Однако по какой-то причине, когда я иду, чтобы скомпилировать это я получаю «Непризнанные последовательность» на кронштейнах. Могу ли я просто использовать \, чтобы избежать скобок?

Струны Я ищу иметь форму

value":[["AB-AB"]] 

или

value":[["ABAB"]] 

, и я хотел бы, чтобы захватить группу [1] из результатов.

+1

вы можете сделать 'Заменить ("[[", "") Заменить (. "]]", "") Split ("");. ' Нет причин для регулярного выражения с чем-то таким простым. – prospector

+0

К сожалению, это лишь часть гораздо большей строки. Раздел, который я опубликовал, является единственной частью, которая имеет значение, поэтому я ищу эту конкретную модель. –

+1

В основном, что происходит, компилятор C# пытается выяснить, что означает '\ ['. Это может быть допустимая escape-последовательность для шаблона Regex, но это не допустимая escape-последовательность в строке C#. В конечном счете вам нужно удвоить свои обратные косые черты, чтобы компилятор увидел '\\ [', который превращается в '\ [' для шаблона Regex. _Edit: Или, как показывают нижеприведенные ответы, просто используйте строковый литерал с '@' и удвойте свои кавычки вместо этого. –

ответ

2

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

String s = @"I have value"":[[""AB-AB""]] and value"":[[""ABAB""]]"; 
foreach (Match m in Regex.Matches(s, @"value"":\[\[""([^""]+)""]]")) 
     Console.WriteLine(m.Groups[1].Value); 

Выход

AB-AB 
ABAB 
+0

Как будут работать группы, если найдено несколько совпадений? –

+1

Использовать метод 'Matches' вместо' ^^^ ' – hwnd

3

Компилятор C# по умолчанию запрещает escape-последовательности, которые он не распознает. Вы можете изменить это поведение с помощью «@», как это:

@"(value\"":\[\[\""([A-Za-z0-9]+(?:-{0,1})[A-Za-z0-9]+)\""\]\])" 

Edit:

Знак @ является немного более сложным, чем это. Цитируется @Guffa:

Строка, ограниченная @, просто не использует обратную косую черту для выхода последовательностей.

Кроме того, следует отметить, что замена \" в такой струне ""

+0

Это нехорошее объяснение того, что «@» делает – bmm6o

+2

Это не будет точно переопределять поведение. Строка с разделителями @ просто не использует обратную косую черту для escape-последовательностей. – Guffa

+0

Очень верно. На самом деле я просто начал работать над редактированием, чтобы расширить это. – pquest

Смежные вопросы