Регулярное выражение не работает в .NET

Итак, я пытаюсь сопоставить регулярное выражение, и я довольно новичок в этом. Я использовал валидатор, и он работает, когда я вставляю код, но не когда он помещается в кодовую часть страницы .NET2.0 C#.

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

"запись;запись2;запись3;запись4;"

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

Мое регулярное выражение:

((;;|[^;])+)

person C Bauer    schedule 29.01.2010    source источник
comment
Можете ли вы удалить тег javascript, так как это вопрос .NET...   -  person t0mm13b    schedule 29.01.2010
comment
nregex.com/nregex/default.aspx полезен для простой проверки регулярных выражений в Интернете и так и sourceforge.net/projects/regulator на рабочем столе. Второй также очень полезен для их изучения.   -  person Sam Holder    schedule 29.01.2010
comment
Я использовал валидатор javascript для проверки моего исходного регулярного выражения. Разница между регулярным выражением С# и javascript, по-видимому, является моей проблемой, поэтому я пометил его как javascript.   -  person C Bauer    schedule 29.01.2010


Ответы (3)


Разделить на следующее регулярное выражение:

(?<!;);(?!;)

Это означает совпадение точек с запятой, которым не предшествует и не предшествует другая точка с запятой.

Например, этот код

var input = "entry;entry2;entry3;entry4;";
foreach (var s in Regex.Split(input, @"(?<!;);(?!;)"))
    Console.WriteLine("[{0}]", s);

производит следующий вывод:

[entry]
[entry2]
[entry3]
[entry4]
[]

Последнее пустое поле является результатом точки с запятой в конце ввода.

Если точка с запятой является терминатором в конце каждого поля, а не разделителем между последовательными полями, вместо этого используйте Regex.Matches.

foreach (Match m in Regex.Matches(input, @"(.+?)(?<!;);(?!;)"))
    Console.WriteLine("[{0}]", m.Groups[1].Value);

получить

[entry]
[entry2]
[entry3]
[entry4]
person Greg Bacon    schedule 29.01.2010
comment
Спасибо! Жаль, что я был так далек от своего оригинала. Этот оставляет пустую запись в конце, какие-нибудь мысли о том, как избавиться от этого? - person C Bauer; 29.01.2010

Почему бы не использовать String.Split в точке с запятой?

string sInput = "Entry1;entry2;entry3;entry4";
string[] sEntries = sInput.Split(';');
// Do what you have to do with the entries in the array...

Надеюсь, это поможет. С уважением, Том.

person t0mm13b    schedule 29.01.2010
comment
Требование но не использовать двойную точку с запятой делает это немного уродливым. - person Austin Salonen; 29.01.2010
comment
проблема в том, что он не хочет разбиваться на двойную точку с запятой (;;), поэтому String.Split() ему не подходит. - person Tamas Czinege; 29.01.2010
comment
Извините, Том, это не сработает, потому что оно разделится на ВСЕ точки с запятой, и мне нужно пропустить двойные точки с запятой, как указано в исходном вопросе. - person C Bauer; 29.01.2010
comment
@DrJokepu: Если вы посмотрите на его образец ввода, там нет двойной точки с запятой ... и в любом случае, если бы она была, в смещении в массиве был бы пустой элемент. - person t0mm13b; 29.01.2010
comment
Вы можете запретить split возвращать пустые значения, используя msdn.microsoft. com/en-us/library/system.stringsplitoptions.aspx - person thijs; 29.01.2010

Как писал tommieb75, вы можете использовать String.Split с перечислением StringSplitOptions, чтобы вы могли контролировать вывод вновь созданного массива разделения.

string input = "entry1;;entry2;;;entry3;entry4;;";
char[] charSeparators = new char[] {';'};
// Split a string delimited by characters and return all non-empty elements.
result = input.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries);

Результат будет содержать только 4 таких элемента:

<entry1><entry2><entry3><entry4>
person nemke    schedule 29.01.2010
comment
Пожалуйста, прочитайте исходный вопрос, чтобы понять, почему это не работает. Я знал, что только регулярное выражение будет работать, прежде чем я задал вопрос. - person C Bauer; 01.02.2010
comment
Итак, вы хотели бы разделить a;b;c;;d на [a][b][c;;d] или [a][b][c][d]. Если это второе, вы все равно можете использовать Split, но если это первое, я удалю свой ответ. - person nemke; 01.02.2010