tr1 :: regex regex_search проблема - PullRequest
       9

tr1 :: regex regex_search проблема

1 голос
/ 29 августа 2010

Я использую tr1 :: regex, чтобы попытаться извлечь некоторые совпадения из строки. Пример строки может быть

asdf werq "one two three" asdf

И я бы хотел выйти из этого:

asdf  
werq  
one two three  
asdf  

С кавычками, сгруппированными вместе, поэтому я пытаюсь использовать регулярное выражение \"(.+?)\"|([^\\s]+) Код, который я использую:

cmatch res;
regex reg("\"(.+?)\"|([^\\s]+)", regex_constants::icase);
regex_search("asdf werq \"one two three\" asdf", res, reg);

cout << res.size() << endl;
for (unsigned int i = 0; i < res.size(); ++k) {
    cout << res[i] << endl;
}

но это выводит

3
asdf

asdf

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 29 августа 2010

Похоже, ваш движок регулярных выражений не поддерживает утверждения за кадром.Чтобы не использовать lookbehinds, вы можете попробовать следующее:

"([^"]*)"|(\S+)

или в кавычках:

"\"([^\"]*)\"|(\\S+)"

Это регулярное выражение будет работать, но каждое совпадение будет иметь два захвата, один из которых будетпусто (либо первое - в случае слова без кавычек, либо второе - в случае строки в кавычках).

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

Я не знаю достаточно о TR1, поэтому я не знаю точно, как каждый повторяет все совпадения.Но если я не ошибаюсь, res.size() всегда будет равен 3.

Например, для строки asdf "one two three" werq первое совпадение будет:

res[0] = "asdf"              // the entire match
res[1] = ""                  // the first capture
res[2] = "asdf"              // the second capture

.второй матч будет:

res[0] = "\"one two three\"" // the entire match including leading/trailing quotes
res[1] = "one two three"     // the first capture
res[2] = ""                  // the second capture

, а третий матч будет:

res[0] = "werq"              // the entire match
res[1] = ""                  // the first capture
res[2] = "werq"              // the second capture

HTH.

0 голосов
/ 29 августа 2010

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

(?<=")[^"]*(?=")|[^"\s]\S*

При цитировании его, конечно, нужно экранировать:

"(?<=\")[^\"]*(?=\")|[^\"\\s]\\S*"

Кстати, код, который вы использовали, вероятно, совпадаеттолько первое слово в целевой строке, так как оно не использует match_any.3 элемента, которые вы получаете в результате, это, вероятно, (1) все совпадение, (2) первый захват - который пуст, и (3) второй захват, который является источником совпадения.

...