2009-11-18 3 views
1

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

Возьмем, к примеру, следующее регулярное выражение:

[EW]\d{1,3}\.\d

Когда пользователь вводит "E123.4", регулярное выражение встречается. Как проверить вход пользователя , пока они печатают его? Могу ли я частично совместить строку «E1» с регулярным выражением?

Есть ли способ сказать, что входная строка только частично соответствует входу? Или есть способ автоматически генерировать подвыражения из основного выражения на основе длины строки?

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

Заранее спасибо. David

+0

Точка должна быть экранированы в вас образец регулярного выражения. – Tomalak

+0

Спасибо - я отредактировал регулярное выражение, чтобы отразить это. –

ответ

1

Вы можете сделать это только сделав каждую часть регулярных выражений по желанию, и повторяя себе:

^([EW]|[EW]\d{1,3}|[EW]\d{1,3}\.|[EW]\d{1,3}\.\d)$ 

Это может работать для простых выражений, но для сложных, это вряд ли осуществимо.

+0

Обратите внимание, что требуются якоря ('^' и '$'), иначе это не будет работать надежно. – Tomalak

0

Трудно сказать ... Если пользователь набирает «E», который соответствует началу, но не остальному. Конечно, вы не знаете, будут ли они продолжать вводить «123.4» или если они просто ударят «Enter» (я предполагаю, что вы сразу же используете «Enter», чтобы указать конец ввода). Можно использовать группы, чтобы проверить, что все 3 группы совпадают, такие как:

([EW])(\d{1,3})(\.\d)

После первого символа, попытайтесь соответствовать первой группе. После следующих нескольких входов совпадайте с первой и второй группой, и когда они вводят '.' и последняя цифра, вы должны найти соответствие для всех 3 групп.

0

Вы можете использовать частичные совпадения, если ваше regex lib поддерживает его (как и Boost.Regex).

Адаптирование is_possible_card_number пример на this page к примеру в вашем вопросе:

#include <boost/regex.hpp> 


// Return false for partial match, true for full match, or throw for 
// impossible match 
bool 
CheckPartialMatch(const std::string& Input, const boost::regex& Regex) 
{ 
boost::match_results<std::string::const_iterator> what; 
if(0 == boost::regex_match(Input, what, Regex, boost::match_default | boost::match_partial)) 
{ 
    // the input so far could not possibly be valid so reject it: 
    throw std::runtime_error(
     "Invalid data entered - this could not possibly be a match"); 
} 

// OK so far so good, but have we finished? 
if(what[0].matched) 
{ 
    // excellent, we have a result: 
    return true; 
} 

// what we have so far is only a partial match... 
return false; 
} 




int main() 
{ 
    const boost::regex r("[EW]\\d{1,3}\\.\\d"); 

    // The input is incomplete, so we expect a "false" result 
    assert(!CheckPartialMatch("E1", r)); 

    // The input completely satisfies the expression, so expect a "true" result 
    assert(CheckPartialMatch("E123.4", r)); 

    try{ 
     // Input can't match the expression, so expect an exception. 
     CheckPartialMatch("EX3", r); 
     assert(false); 
    } 
    catch(const std::runtime_error&){ 
    } 

    return 0; 
} 
+0

Я использую Boost 1.35, и мы посмотрели на частичные совпадения, но он не сказал бы мне, какой сегмент регулярного выражения он не смог. Все сегменты соответствия, которые он вернул, имели ложь в поле isMatched. –

+0

Я не уверен, что понимаю ваш комментарий. Под «сегментом» вы ссылаетесь на «отмеченное подвыражение» (http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/html/boost_regex/captures.html)? –

+0

Чтобы уточнить, я обновил свой ответ на примере –

Смежные вопросы