Частичное совпадение регулярного выражения - PullRequest
3 голосов
/ 21 января 2011

У меня есть регулярное выражение, которое я проверяю входной поток символов. Интересно, есть ли способ сопоставить регулярное выражение со входом и определить, является ли это частичное совпадение, которое использует весь входной буфер? То есть конец входного буфера достигается до завершения регулярного выражения. Я хотел бы, чтобы реализация решала, ждать ли больше вводимых символов или прервать операцию.

Другими словами, мне нужно определить, какая из них истинна: ​​

  1. Конец входного буфера был достигнут до того, как было найдено регулярное выражение

    например. "foo" =~ /^foobar/

  2. Регулярное выражение полностью совпадает

    например. "foobar" =~ /^foobar/

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

    например. "fuubar" =~ /^foobar

Вход не упакован.

Ответы [ 2 ]

0 голосов
/ 21 января 2011

Я не уверен, что это ваш вопрос, но.
Регулярные выражения либо совпадают, либо нет. И выражение будет соответствовать переменному количеству ввода. Таким образом, это не может быть определено напрямую.

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

Есть много способов сделать это.

Один из способов - сопоставить все, что не совпадает, с помощью утверждений вплоть до начала. матча (но не полный матч, который вы ищете). Это вы просто выбросите и очистите от буфера. Когда вы получите совпадение, которое вы ищете, очистите буфер этих данных и данных перед ним.

Пример: /(<function.*?>)|([^<]*)/ Часть, которую вы выбросили / очистили из буфера, находится в буфере захвата группы 2.

Другой способ - если вы сопоставляете строки конечной длины, если вы ничего не соответствуете в буфер, вы можете безопасно отбросить все от начала буфера до конца буфера минус длина конечной строки, которую вы ищете.

Пример: размер вашего буфера составляет 64 КБ. Вы ищете строку длиной 10. Она не была найдена в буфере. Вы можете безопасно очистить (64k - 10) байтов, сохранив последние 10 байтов. Затем добавьте (64k-10) байтов в конец буфера. Конечно, вам нужен только буфер размером 10 байт, постоянно удаляющий / добавляющий 1 символ, но больший буфер больше эффективный, и вы можете использовать пороги для перезагрузки большего количества данных.

Если вы можете создать буфер, который легко сокращается / расширяется, доступны дополнительные параметры буферизации.

0 голосов
/ 21 января 2011

Это сценарий, который вы решаете? Вы ждете буквальную строку, например, 'Foobar'. Если пользователь вводит частичное совпадение, например, «Фу», вы хотите продолжать ждать. Если вход не соответствует, вы хотите выйти.

Если вы работаете с литеральными строками, я просто написал бы цикл для проверки последовательности символов. Или

If (input.Length < target.Length && target.StartsWith(input))
   // keep trying

Если вы пытаетесь сопоставить более сложные регулярные выражения, я не знаю, как это сделать с помощью регулярных выражений. Но я бы начал с того, что прочитал больше о том, как платформа реализует регулярные выражения.

1008 * Том *

...