Вы можете использовать регулярное выражение, похожее на предложенное:
(?:^value_name\s+)?([^,]+)(?:\s*,\s*)?
Первая группа не захватывает и будет соответствовать началу строки и value_name
.
Чтобы убедиться, что регулярное выражение остается действительным для всех совпадений, мы делаем эту группу необязательной, используя измененный '?'
(то есть совпадение самое большее один раз ).
Вторая группа захватывает и будет соответствовать вашим vXX
данным.
Третья группа не захватывает и будет соответствовать ,
и любым пробелам до и после него.
Опять же, мы делаем это необязательным, используя модификатор '?'
, в противном случае последняя группа 'vXX'
не будет соответствовать, если мы не закончили строку с окончательным ','
.
В ваших испытаниях регулярное выражение не будет совпадать несколько раз: вы должны помнить, что если вы хотите, чтобы регулярное выражение совпадало с несколькими вхождениями в строках, все регулярное выражение должно совпадать с для каждого вхождения в строка, так что вы должны построить свое регулярное выражение не только так, чтобы оно соответствовало началу строки 'value_name'
, но также соответствовало каждому вхождению 'vXX'
в ней.
В C # вы можете перечислить все совпадения и группы, используя такой код:
Regex r = new Regex(@"(?:^value_name\s+)?([^,]+)(?:\s*,\s*)?");
Match m = r.Match(subjectString);
while (m.Success) {
for (int i = 1; i < m.Groups.Count; i++) {
Group g = m.Groups[i];
if (g.Success) {
// matched text: g.Value
// match start: g.Index
// match length: g.Length
}
}
m = m.NextMatch();
}