2010-09-17 4 views
3

у меня есть шаблон, как, как этотизвлечь значение внутри определенного шаблона

"The world is #bright# and #beautiful#" 

мне нужно, чтобы получить строку «яркий», «красивый» внутри # # .. любые указатели


Мои решение (спасибо Болу):

string s = "The world is #bright# and #beautiful#"; 
    string[] str = s.Split('#'); 
    for (int i = 0; i <= str.Length - 1; i++) 
    { 
     if (i % 2 != 0) 
     { 
      Response.Write(str[i] + "<br />"); 
     } 
    } 
+0

Дарен предоставил более подходящий ответ, чем я, но см. Здесь для ссылки на группировку и обратная связь: http: //www.regular-expres sions.info/brackets.html – annakata

+2

Asif, пожалуйста, отметьте ответ @ Bolu (который вы использовали с небольшой модификацией), как принято. Я отредактировал ваш вопрос, чтобы включить внесенную вами модификацию. Благодарю. – Will

ответ

7

Если все, что вы хотите, это строка в ##, то нет необходимости в регулярных выражениях, просто используйте String.split:

string rawstring="The world is #bright# and beautiful"; 
string[] tem=rawstring.Split('#'); 

После этого вам нужно получить ровный предмет (с индексом: 1,3,5 ....) от string[] tem

+0

Я отметил ваш ответ ;-) –

4

пока вы не можете иметь вложенные #...# последовательности, #([^#]+)# будет работать и будет захватывать контент между # в качестве первого backreference.

Объяснение:

#  match a literal # character 
(  open a capturing group 
    [^  open a negated character class 
    # don't match # (since the character class is negated) 
    ]+  close the class, match it one or more times 
)  close the capturing group 
#  match a literal # character 
+0

Я искренне растерян. Где ОП говорит, что он имеет вложенные последовательности? Или вы просто подчеркиваете это как потенциальную проблему. – annakata

+1

@annakata просто выделяет его как проблему, которая нарушит регулярное выражение. –

+0

@annakata - он выделяет его как потенциальную проблему. Регулярные выражения - это звуковая математическая вещь. Если вы их забудете, вы, вероятно, математически здоровы и склонны беспокоиться о потенциальных проблемах. Это хорошо, но довольно часто вы можете выполнить работу намного быстрее, не беспокоясь;) –

3

Отъезд Match объект:

var match = Regex.Match(yourstring, @"The world is #(.*)# and beautiful") 
var bright = match.Groups[1] 

Конечно, это ломается, когда у вас есть более двух # 'S в строке. Тогда вы, вероятно, захотите сделать не-жадный матч. Это можно сделать с помощью регулярного выражения «#(.*?)#». Это будет соответствовать кратчайшей строке между двумя острыми предметами и все еще иметь содержимое в первой группе.

+0

+1 Но, хотя не жадный, это хорошо, я бы предостерег от мысли, что он решает много - ложное чувство безопасности, когда вы рассматриваете вложенные и незамкнутые последовательности, хотя, конечно, OP открывает себе это, просто имея единственный разделитель I предположим. – annakata

+0

Иногда такие системы не обязательно должны быть полностью звуковыми - скажем, у вас всегда есть «идентификатор» между острыми предметами. Затем вы можете использовать '# ([a-zA-Z0-9 _] +) #' и переходить к нему. Я использовал такие вещи, как это для простых макросистем, раньше - если вы управляете входом, не так много может пойти не так ... –

2

Вам нужно настроить Capturing Group обертывание части, которую вы хотите, чтобы захватить в круглых скобках () и, возможно, указав имя для захвата:

Regex r = new Regex(@"#([^#]+?)#"); 

, которые можно получить с помощью этого кода:

Match m = r.Match("The world is #bright# and beautiful"); 
string capture = m.Groups[1]; 

Или с именем параметра:

Regex r = new Regex(@"#(?<mycapture>[^#]+?)#"); 

, которые можно получить с помощью этого кода:

Match m = r.Match("The world is #bright# and beautiful"); 
string capture = m.Groups["mycapture"]; 
Смежные вопросы