Не оператор в регулярном выражении
Учитывая следующую строку
1080s: 33, 6'2" meg: test. 1748s: I THINK IM GONNA <span class="highlight" >PICK</span> 1749s: TWO COMPLETE OPPOSITES.
Я хочу сделать операцию регулярного выражения на нем, и хочу следующие совпадения
1st match : 1080s: 33, 6'2" 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 ответа
Вы можете использовать регулярное выражение, как подсказывает @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, а затем :
,
Как только вход был разделен, затем очистите вход, чтобы удалить пустые записи.
Вы должны сказать движку регулярных выражений: "В конце регулярного выражения, сразу после матча, должно быть (\\d*)(s:)
или конец строки ". Это может быть сделано с помощью предвкушения.
Если вы хотите сопоставить любое количество цифр (а не только 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:
или просто конец строки ($
). Обратите внимание, что этот прогноз является утверждением и не включен в сравнение. Это просто гарантирует, что за матчем следует предвкушение.