c ++ boost regex, какой элемент был истинным - PullRequest
0 голосов
/ 16 декабря 2009

Ответ на это может быть простым нет, но здесь идет ...

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

Вместо того, чтобы просто возвращать T / F, есть ли способ узнать, какой элемент из нескольких объединенных операторов оценивается как true?

Например:

^a$|^z$|^p$

a --> 0
z --> 1
f --> -1

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

Заключите их в скобки, а затем проверьте, какое подвыражение соответствует.

(^a$)|(^z$)|(^p$)


match_results m;
regex_match(..., m);

a -> m[1].matched

z -> m[2].matched

p -> m[3].matched

Обновление:

Вы можете улучшить его, сделав одну группу захвата и протестировав результат, например ::

^([azp])$
...
if ('a' == m[0][0]) ...

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

Очевидно, что вы устанавливаете регулярное выражение только один раз, а не каждый раз, когда вам это нужно.

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

0 голосов
/ 17 декабря 2009

Если вы хотите проанализировать текст, соответствующий этому уровню детализации, возможно, вам следует рассмотреть возможность использования Spirit boost вместо regex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...