Вопрос знатокам boost::regex
От: agg  
Дата: 17.11.09 09:02
Оценка:
Привет всем, писал распознавалку номеров, сделал, спеки динамично поменяли и теперь мне нужно найти не просто нужный нужный номер, а нужный номер +20 символов перед ним, искал номера вот так:

...
typedef std::wstring str;
typedef std::list<str> LPN;
typedef LPN::iterator ILPN;
...
static LPN lpn;
...
static bool regex_callback(const boost::match_results<str::const_iterator>& what)
{
    lpn.push_back(what[0]);
    return true;
}
...
BOOL GetNumbersFromText(str text, LPN &out_list)
    {
        try{
        lpn.clear();
        boost::wsregex_iterator m_end;
        boost::wsregex_iterator mu(text.begin(), text.end(), expu);
        std::for_each(mu, m_end, regex_callback);
        out_list=lpn;
        }
        catch(...)
        {
            return FALSE;
        }
        return TRUE;
    }


В этом коде зовется regex_callback столько раз сколько найдено номеров и соответственно я их перекладываю в список, а как искать позиции в тексте с которых начинаются номера, чтобы мне потом можно было отступить 20 символов от того места где начинается номер?
Re: Вопрос знатокам boost::regex
От: XuMuK Россия  
Дата: 17.11.09 11:06
Оценка:
Здравствуйте, agg, Вы писали:

agg>Привет всем, писал распознавалку номеров, сделал, спеки динамично поменяли и теперь мне нужно найти не просто нужный нужный номер, а нужный номер +20 символов перед ним, искал номера вот так:


можно использовать группировку, например, для регэкспа:
^\w{20}(\d+).*?$


agg>
agg>...
agg>typedef std::wstring str;
agg>typedef std::list<str> LPN;
agg>typedef LPN::iterator ILPN;
agg>...
agg>static LPN lpn;
agg>...
agg>static bool regex_callback(const boost::match_results<str::const_iterator>& what)
agg>{
agg>    lpn.push_back(what.str(1).str());
agg>    return true;
agg>}
agg>


agg>В этом коде зовется regex_callback столько раз сколько найдено номеров и соответственно я их перекладываю в список, а как искать позиции в тексте с которых начинаются номера, чтобы мне потом можно было отступить 20 символов от того места где начинается номер?


учтите, что в группе с номером 0 лежит вся строка, а начиная с 1, подгруппы.
Re[2]: Вопрос знатокам boost::regex
От: agg  
Дата: 17.11.09 11:46
Оценка:
Здравствуйте, XuMuK, Вы писали:

XMK>учтите, что в группе с номером 0 лежит вся строка, а начиная с 1, подгруппы.


Спасибо за ответ, но честно говоря я регулярными выражениями занялся впервые поэтому ваш ответ мне мало что сказал
Re[3]: Вопрос знатокам boost::regex
От: XuMuK Россия  
Дата: 17.11.09 12:57
Оценка:
Здравствуйте, agg, Вы писали:

agg>Здравствуйте, XuMuK, Вы писали:


XMK>>учтите, что в группе с номером 0 лежит вся строка, а начиная с 1, подгруппы.


agg>Спасибо за ответ, но честно говоря я регулярными выражениями занялся впервые поэтому ваш ответ мне мало что сказал


если в кратце, то все что внутри круглых в регэкспе называется группой, и может быть получено как отдельная строка, т.е. в вашем регэкспе достаточно взять то что считается номером в скобки и потом получить группу с нужным номером (если группа только одна, то нужна группа номер 1). подробнее можно почитать в документации на тот же boost::regex.

PS напишите регэксп которым пользуетесь, думаю с ним будет намного проще понять что вам надо.
Re: Вопрос знатокам boost::regex
От: jazzer Россия Skype: enerjazzer
Дата: 18.11.09 02:44
Оценка:
Здравствуйте, agg, Вы писали:

agg>Привет всем, писал распознавалку номеров, сделал, спеки динамично поменяли и теперь мне нужно найти не просто нужный нужный номер, а нужный номер +20 символов перед ним, искал номера вот так:


Где текст самого регекспа-то?

Вкратце, если у тебя есть регэксп "X", который матчит номер, то тебе нужен регэксп ".{20}X", т.е. "20 любых символов а потом Х".
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Вопрос знатокам boost::regex
От: agg  
Дата: 18.11.09 04:44
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Где текст самого регекспа-то?


J>Вкратце, если у тебя есть регэксп "X", который матчит номер, то тебе нужен регэксп ".{20}X", т.е. "20 любых символов а потом Х".


Вот регэксп:
typedef std::wstring str;
...
const str spr=L"[\\-\\. ]?";  //separators "-", ".", " ", ""
const str fn=spr+str(L"\\d{3}")+spr+str(L"\\d{2}")+spr+str(L"\\d{2}");  //7 symbols last
...
const str fu=str(L"([\\+][1]")+spr+str(L"\\d{3}|[\\+][1]")+spr+str(L"[\\(]")
+str(L"\\d{3}")+str(L"[\\)]|[\\(][\\+][1]")+spr+str(L"\\d{3}")+str(L"\\)|[1]")
+spr+str(L"\\d{3}|[1]")+spr+str(L"[\\(]")+str(L"\\d{3}")+str(L"[\\)]|[\\(][1]")
+spr+str(L"\\d{3}")+str(L"\\)|\\d{3}|[\\(]")+spr+str(L"\\d{3}")+str(L"\\))")+fn;

Вот такой замороченный регэксп, там просто через или 8 нужных форматов номеров
Re[3]: Вопрос знатокам boost::regex
От: XuMuK Россия  
Дата: 18.11.09 10:09
Оценка:
Здравствуйте, agg, Вы писали:

agg>Здравствуйте, jazzer, Вы писали:


J>>Где текст самого регекспа-то?


J>>Вкратце, если у тебя есть регэксп "X", который матчит номер, то тебе нужен регэксп ".{20}X", т.е. "20 любых символов а потом Х".


agg>Вот регэксп:

agg>
agg>typedef std::wstring str;
agg>...
agg>const str spr=L"[\\-\\. ]?";  //separators "-", ".", " ", ""
agg>const str fn=spr+str(L"\\d{3}")+spr+str(L"\\d{2}")+spr+str(L"\\d{2}");  //7 symbols last
agg>...
agg>const str fu=str(L"([\\+][1]")+spr+str(L"\\d{3}|[\\+][1]")+spr+str(L"[\\(]")
agg>+str(L"\\d{3}")+str(L"[\\)]|[\\(][\\+][1]")+spr+str(L"\\d{3}")+str(L"\\)|[1]")
agg>+spr+str(L"\\d{3}|[1]")+spr+str(L"[\\(]")+str(L"\\d{3}")+str(L"[\\)]|[\\(][1]")
agg>+spr+str(L"\\d{3}")+str(L"\\)|\\d{3}|[\\(]")+spr+str(L"\\d{3}")+str(L"\\))")+fn;
agg>

agg>Вот такой замороченный регэксп, там просто через или 8 нужных форматов номеров

в вашем случае весь регэксп является подгруппой, т.к. заключен в скобки.
полагаю надо делать так:

const str re = L".{20}" + fu; // use 're' instead of 'fu'
....
static bool regex_callback(const boost::match_results<str::const_iterator>& what)
{
  lpn.push_back(what.str(1)); // 1 - number of the match group
  return true;
}
Re[3]: Вопрос знатокам boost::regex
От: Caracrist https://1pwd.org/
Дата: 18.11.09 14:23
Оценка:
Здравствуйте, agg, Вы писали:

agg>Здравствуйте, jazzer, Вы писали:


J>>Где текст самого регекспа-то?


J>>Вкратце, если у тебя есть регэксп "X", который матчит номер, то тебе нужен регэксп ".{20}X", т.е. "20 любых символов а потом Х".


agg>Вот регэксп:

agg>
agg>typedef std::wstring str;
agg>...
agg>const str spr=L"[\\-\\. ]?";  //separators "-", ".", " ", ""
agg>const str fn=spr+str(L"\\d{3}")+spr+str(L"\\d{2}")+spr+str(L"\\d{2}");  //7 symbols last
agg>...
agg>const str fu=str(L"([\\+][1]")+spr+str(L"\\d{3}|[\\+][1]")+spr+str(L"[\\(]")
agg>+str(L"\\d{3}")+str(L"[\\)]|[\\(][\\+][1]")+spr+str(L"\\d{3}")+str(L"\\)|[1]")
agg>+spr+str(L"\\d{3}|[1]")+spr+str(L"[\\(]")+str(L"\\d{3}")+str(L"[\\)]|[\\(][1]")
agg>+spr+str(L"\\d{3}")+str(L"\\)|\\d{3}|[\\(]")+spr+str(L"\\d{3}")+str(L"\\))")+fn;
agg>

agg>Вот такой замороченный регэксп, там просто через или 8 нужных форматов номеров

почему: "[\\+][1]"
буст так "\\+1" не понимает?
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.