Не оператор в регулярном выражении - PullRequest
3 голосов
/ 03 января 2012

Учитывая следующую строку

1080s: 33, 6&apos;2&quot; meg: test. 1748s: I THINK IM GONNA <span class="highlight" >PICK</span> 1749s: TWO COMPLETE OPPOSITES.

Я хочу выполнить операцию регулярного выражения и хочу следующие совпадения

1st match : 1080s: 33, 6&apos;2&quot; meg: test. 
2nd match : 1748s: I THINK IM GONNA <span class="highlight" >PICK</span> 
3rd match : 1749s: TWO COMPLETE OPPOSITES.

Я использую следующее регулярное выражение в ASP.NET для сопоставления

MatchCollection mcs = Regex.Matches(txtData, "(\\d*)(s:)([^(\\d*)](s:){0})*");

Регулярное выражение будет соответствовать, но захваты неверны. Регулярное выражение пропускает текст, как только находит \d* или s:. Я хочу, чтобы он пропустил, если и только если \d*s: найден вместе.

Я пробовал несколько разных способов, но до сих пор не нашел, как объединить \d* и s: в не оператор.

Ответы [ 3 ]

4 голосов
/ 03 января 2012

Вы должны указать механизму регулярных выражений: «В конце регулярного выражения, сразу после матча, должен быть (\\d*)(s:) или конец строки». Это можно сделать, используя lookahead .

3 голосов
/ 03 января 2012

Если вы хотите сопоставить любое количество цифр (а не только 4), вы можете сделать это, используя этот код:

var pattern = @".+?(?<!\d)((?=\d+s:)|$)";
var matches = Regex.Matches(input, pattern);

.+? является нежадным совпадение хотя бы одного символа.Он должен быть не жадным, иначе .+ будет соответствовать всей строке, пропускающей любые вхождения \d+s:.

(?<!\d) является отрицательным взглядом позади , который гарантирует, чтопоследний символ, соответствующий ., не является цифрой.Это необходимо, потому что число цифр не фиксировано, чтобы сказать 4. Если этот взгляд за спиной не включен, вход «X12» может соответствовать либо any, digit, digit, либо any, any, digit.Вы хотите избежать второго совпадения и хотите, чтобы заглядывание показывало, что 1 соответствует digit, а не any.

((?=\d+s:)|$) является положительным прогнозом , которыйгарантирует, что совпадение заканчивается либо несколькими цифрами, за которыми следует s:, либо просто концом строки ($).Обратите внимание, что этот прогноз является утверждением и не включен в сравнение.Это просто гарантирует, что за матчем следует предвкушение.

2 голосов
/ 03 января 2012

Вы можете использовать регулярное выражение в положительном ключе , как предлагает @ Ilya,

var pattern = @"\b(?=\s*\d{0,4}s:)";
var lines = new Regex(pattern).Split(input).Where(
    s => 
    string.IsNullOrEmpty(s.Trim()) == false).ToArray();

Объяснение
\b(?=\s*\d{0,4}s:) -> Начиная с границы словаСовпадение суффикса, но исключить его из захвата.Суффикс определяется как «Любое количество пробельных символов, за которыми следуют цифры длиной от 0 до 4, затем s, а затем :.
Как только вход разделен, затем очистите вход, чтобы удалить пустые записи.

...