Прежде всего, помните, чтобы #include <regex>
.
C++ std::regex_match
работает как регулярные выражения на других языках. начало
Давайте на простом примере:
std::string str = "Mem(100)=120";
std::regex regex("^Mem\\([0-9]+\\)=[0-9]+$");
std::cout << std::regex_match(str, regex) << std::endl;
В этом случае наше регулярное выражение ^Mem\([0-9]+\)=[0-9]+$
. Давайте посмотрим на то, что он делает:
^
в начале говорит C++ это, где начинается линия, поэтому AMem(1)=2
не должны совпадать.
$
в конце говорит C++, где заканчивается линия, поэтому Mem(1)=2x
не должен совпадать.
\\(
- буква (
персонаж. (
имеет особое значение в регулярных выражениях, поэтому мы избегаем его \(
. Однако символ \
имеет особое значение в строках C++, поэтому мы используем \\(
, чтобы сообщить C++ передать \(
в механизм регулярных выражений.
[0-9]
соответствует цифре. \\d
также должен работать, но then again maybe not.
[0-9]+
означает как минимум один разряд. Если Mem()
является приемлемым, используйте вместо этого [0-9]*
.
Как вы можете видеть, это похоже на регулярные выражения, которые вы найдете на других языках (например, Java или C#).
Теперь, чтобы рассмотреть пробелы, используйте std::regex regex("^\\s*Mem\\([0-9]+\\)\\s*=\\s*[0-9]+\\s*$");
Обратите внимание, что \s
не включает \t
, поэтому нет необходимости указывать оба. Если это не так, вы должны использовать (\s|\t)
или [\s\t]
, а не (\s,\t)
.
И, наконец, чтобы включить номера с плавающей запятой, сначала нужно подумать, допустимо ли Mem(1) = 1.
(т. Е. Точка без номера после него).
Если это не так, то .23
в 1.23
является факультативно. В regexes мы используем ?
, чтобы указать это.
std::regex regex("^[\\s]*Mem\\([0-9]+\\)\\s*=\\s*[0-9]+(\\.[0-9]+)?\\s*$");
Обратите внимание, что мы используем \.
вместо лишь .
. .
имеет особое значение в регулярных выражениях - он соответствует любому символу, поэтому нам нужно его избежать.
Если у вас есть компилятор, который поддерживает исходные строки (например, Visual Studio 2013, GCC 4.5, Clang 3.0), можно упростить регулярное выражение строки:
std::regex regex(R"(^[\s]*Mem\([0-9]+\)\s*=\s*[0-9]+(\.[0-9]+)?\s*$)")
Для извлечения информации о найденной строке, вы можете использовать std::smatch
и группы. начало
Давайте с небольшим изменением:
std::string str = " Mem(100)=120";
std::regex regex("^[\\s]*Mem\\(([0-9]+)\\)\\s*=\\s*([0-9]+(\\.[0-9]+)?)\\s*$");
std::smatch m;
std::cout << std::regex_match(str, m, regex) << std::endl;
Примечание три вещи:
- Мы добавили
smatch
. Этот класс хранит дополнительную информацию о результатах матча.
- Мы добавили дополнительные скобки вокруг
[0-9]*
. Это определяет группу. Группы сообщают движку регулярных выражений отслеживать все, что находится внутри них.
- Еще скобки вокруг числа с плавающей запятой. Это определяет вторую группу.
Очень важно скобка, которые определяют группы не избежала, так как мы не хотим, чтобы соответствовать фактическим символам скобки. Мы действительно хотим использовать специальное значение регулярного выражения.
Теперь у нас есть группы, мы можем использовать их:
for (auto result : m) {
std::cout << result << std::endl;
}
Это первый печать всю строку, то число в Mem()
, то окончательное число.
Другими словами, m[0]
дает нам весь матч, m[1]
дает нам первую группу, m[2]
дает нам вторую группу и m[3]
даст нам третью группу, если у нас была одна.
Я не совсем понимаю вопрос. Если вы хотите знать, как использовать регулярное выражение на C++, есть много примеров. Кстати, вам, вероятно, следует избегать ваших скобок - '... Mem \ ([0-9] * \) ...'. – Dukeling
@ Dukeling, поэтому я спросил здесь. Я не мог найти аналогичный пример, и не мог понять, как работает сопоставление шаблонов регулярных выражений. –
Регулярные выражения являются излишними для такого простого шаблона. Прочитайте строку в строке, ищите '(', search ')', ищите следующую цифру. –