C++中正则表达式的使用方法详解

目录
  • 介绍
  • 1. C++ 中的正则表达式 (Regex)
    • 1.1 范围规范
    • 1.2 重复模式
  • 2. C++正则表达式的例子
  • 3. C++正则表达式中使用的函数模板
    • 3.1 regex_match()
    • 3.2 regex_search()
    • 3.3 regex_replace()
  • 4.C++输入验证
  • 5.总结

介绍

C++ 正则表达式教程解释了 C++ 中正则表达式的工作,包括正则表达式匹配、搜索、替换、输入验证和标记化的功能。

几乎所有的编程语言都支持正则表达式。 C++ 从 C++11 开始直接支持正则表达式。除了编程语言之外,大多数文本处理程序(如词法分析器、高级文本编辑器等)都使用正则表达式。

在本教程中,我们将探讨正则表达式的一般细节以及 C++ 编程方面的细节。

正则匹配中的基础符号

  • ^开头
  • ()组
  • []或,
  • {}几次
  • $结尾

1. C++ 中的正则表达式 (Regex)

正则表达式是包含一系列字符的表达式,这些字符定义了可用于字符串搜索算法、查找或查找/替换算法等的特定搜索模式。正则表达式也用于输入验证。

大多数编程语言要么为正则表达式提供内置功能,要么通过库提供。从 C++11 开始,C++ 通过 标准库提供正则表达式支持。

用于解析正则表达式的正则表达式处理器将其转换为内部表示,该表示被执行并与表示正在搜索的文本的字符串匹配。 C++11 使用 ECMAScript 语法作为正则表达式的默认语法。 ECMAScript 很简单,但它提供了强大的正则表达式功能。 让我们看看我们在正则表达式中指定的一些模式,如范围规范、重复模式等。

1.1 范围规范

指定字符或文字的范围是正则表达式中使用的最简单的标准之一。

例如,我们可以指定一个从a到z的小写字母范围,如下所示:[a-z],这将只匹配一个小写字符。

下列条件:[A-Za-z0-9]

上面的表达式指定了包含一个大写字母、一个小写字母和0到9之间的数字的范围。

上述表达式中的方括号([])具有特殊含义,即用于指定范围。如果你想包含一个括号作为表达式的一部分,那么你需要转义它。

那么下面的表达式,[\[0-9]

上面的表达式表示一个左括号和一个0到9范围内的数字作为正则表达式。

但请注意,当我们使用 C++ 编程时,我们需要使用 C++ 特定的转义序列,如下所示:[\\[0-9]

1.2 重复模式

我们上面指定的范围示例只匹配一个字符或文字。如果我们想匹配多个字符,我们通常在模式中指定“表达式修饰符”,从而使其成为一个重复的模式。

表达式修饰符可以是+,表示匹配一个模式出现一次或多次,也可以是*,表示匹配一个模式出现零次或多次。

例如,下面的表达式,

[a-z]+ 匹配 a、aaa、abcd、softwaretestinghelp 等字符串。请注意,它永远不会匹配空白字符串。

[a-z]*将匹配一个空白字符串或任何上面的字符串。

如果要指定一组字符匹配一次或多次,则可以使用括号,如下所示:(Xyz)+

上面的表达式将匹配Xyz、XyzXyz和XyzXyz等等。

2. C++正则表达式的例子

考虑一个匹配 MS-DOS 文件名的正则表达式,如下所示。

char regex_filename[] = “[a-zA-Z_] [a-zA-Z_0-9]*\\.[a-zA-Z0-9]+”;

上面的正则表达式可以解释如下:

匹配一个字母(小写,然后大写)或下划线。然后匹配零个或多个字符,其中每个字符可以是字母、下划线或数字。然后匹配文字点(.)。在点之后,匹配一个或多个字符,其中每个字符可以是表示文件扩展名的字母或数字。

3. C++正则表达式中使用的函数模板

现在让我们讨论在 C++ 中编写正则表达式时的一些重要函数模板。

3.1 regex_match()

此函数模板用于匹配给定的模式。如果给定的表达式与字符串匹配,则此函数返回 true。否则,该函数返回 false。

以下是演示 regex_match 函数的 C++ 编程示例。

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main () {

   if (regex_match ("softwareTesting", regex("(soft)(.*)") ))
      cout << "string:literal => matched\n";

   const char mystr[] = "SoftwareTestingHelp";
   string str ("software");
   regex str_expr ("(soft)(.*)");

   if (regex_match (str,str_expr))
      cout << "string:object => matched\n";

   if ( regex_match ( str.begin(), str.end(), str_expr ) )
      cout << "string:range(begin-end)=> matched\n";

   cmatch cm;  //匹配的词语检索出来
   regex_match (mystr,cm,str_expr);

   smatch sm;
   regex_match (str,sm,str_expr);

   regex_match ( str.cbegin(), str.cend(), sm, str_expr);
   cout << "String:range, size:" << sm.size() << " matches\n";

   regex_match ( mystr, cm, str_expr, regex_constants::match_default );

   cout << "the matches are: ";
   for (unsigned i=0; i<sm.size(); ++i) {
      cout << "[" << sm[i] << "] ";
   }

   cout << endl;

   return 0;
}

在上面的程序中,首先,我们使用regex_match函数将字符串" softwareTesting "与正则表达式" (soft)(.*) "匹配。随后,我们还通过向regex_match传递字符串对象、范围等来演示regex_match的不同变体。

3.2 regex_search()

函数regex_search()用于在字符串中搜索匹配正则表达式的模式。

考虑下面的c++程序,它显示了regex_search()的用法。

#include <iostream>
#include <regex>
#include<string.h>
using namespace std; 

int main()
{
    //string to be searched
    string mystr = "She sells_sea shells in the sea shore"; 

    // regex expression for pattern to be searched
    regex regexp("s[a-z_]+"); 

    // flag type for determining the matching behavior (in this case on string objects)
     smatch m; 

    // regex_search that searches pattern regexp in the string mystr
    regex_search(mystr, m, regexp); 

    cout<<"String that matches the pattern:"<<endl;
    for (auto x : m)
        cout << x << " ";
    return 0;
}

我们先指定一个字符串,然后使用regex对象指定一个正则表达式。这个字符串和regex连同smatch标志类型一起被传递给regex_search函数。该函数在输入字符串中搜索第一个出现的模式,并返回匹配的字符串。

3.3 regex_replace()

函数regex_replace()用于用字符串替换与正则表达式匹配的模式。

让我们使用一个c++程序来演示regex_replace()函数。

#include <iostream>
#include <string>
#include <regex>
#include <iterator>
using namespace std; 

int main()
{
    string mystr = "This is software testing Help portal \n"; 

    cout<<"Input string: "<<mystr<<endl;

    // regex to match string beginning with 'p'
    regex regexp("p[a-zA-z]+");
    cout<<"Replace the word 'portal' with word 'website' : ";
    // regex_replace() for replacing the match with the word 'website'
    cout << regex_replace(mystr, regexp, "website"); 

    string result; 

    cout<<"Replace the word 'website' back to 'portal': ";
    // regex_replace( ) for replacing the match back with 'portal'
    regex_replace(back_inserter(result), mystr.begin(), mystr.end(),
                  regexp,  "portal"); 

    cout << result; 

    return 0;
}

这里,我们有一个输入字符串。我们提供了一个正则表达式来匹配以 p 开头的字符串。然后我们将匹配的单词替换为website。接下来,我们将website替换回portal。

4.C++输入验证

我们已经讨论了使用regex进行模式匹配的主要函数模板。值得注意的是,regex服务的主要目的是输入验证。可以使用regex表达式验证从标准输入设备输入的输入。

检查下面的程序,以演示如何使用regex验证传入的数据。

#include <iostream>
#include <regex>
#include <string>
using namespace std;

int main()
{
    string input;
    regex integer_expr("(\\+|-)?[[:digit:]]+");
    //As long as the input is correct ask for another number
    while(true)
    {
        cout<<"Enter the input: ";
        cin>>input;
        if(!cin) break;
        //Exit when the user inputs q
        if(input=="q")
            break;
        if(regex_match(input,integer_expr))
            cout<<"Input is an integer"<<endl;
        else
        {cout<<"Invalid input : Not an integer"<<endl;}
    }
}

这个程序匹配用户输入的输入,以验证它是否是整数。上面的输出显示,当输入一个整数时,它会给出一个适当的消息,而当输入任何其他数据时,它会将该消息作为无效输入。

5.总结

Regex在搜索引擎中用于搜索模式,搜索和替换应用程序的对话框,如字处理器和文本编辑器。Regex也用于UNIX实用程序,如sed、awk以及程序的词法分析。

在本教程中,我们已经看到了用于匹配、搜索和替换模式的函数。使用这些函数,我们基本上可以开发一个高效的应用程序,使用regex实现所需的功能。

Regex允许通过修补模式有效地验证输入或搜索并替换字符串,这可以使用很少的行来完成。

以上就是C++中正则表达式的使用方法详解的详细内容,更多关于C++正则表达式的资料请关注我们其它相关文章!

(0)

相关推荐

  • 正则表达式简介及在C++11中的简单使用教程

    正则表达式Regex(regular expression)是一种强大的描述字符序列的工具.在许多语言中都存在着正则表达式,C++11中也将正则表达式纳入了新标准的一部分,不仅如此,它还支持了6种不同的正则表达式的语法,分别是:ECMASCRIPT.basic.extended.awk.grep和egrep.其中ECMASCRIPT是默认的语法,具体使用哪种语法我们可以在构造正则表达式的时候指定. 正则表达式是一种文本模式.正则表达式是强大.便捷.高效的文本处理工具.正则表达式本身,加上如同一门

  • c++11中regex正则表达式示例简述

    regex库中涉及到的主要类型有: 以std::string为代表的处理字符串的类型(我们知道还有存储wchar_t的wstring类.原生c式字符串const char*等等,为了简化处理仅介绍std::string类型相关的操作,当你把握住了regex的主脉络之后,想使用其他的版本只要类比就可以) std::regex类,该类型需要一个代表正则表达式的字符串和一个文法选项作为输入,当文法选项不提供时默认为ECMAScript. std::match_results类,该类用来记录匹配的结果,

  • C++实现LeetCode(10.正则表达式匹配)

    [LeetCode] 10. Regular Expression Matching 正则表达式匹配 Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. T

  • c++使用正则表达式提取关键字的方法

    下面看下c++通过正则表达式提取关键字,代码如下所示: string text = "岳云鹏的对象叫铁锤"; regex pattern("(.*)的对象叫(.*)"); smatch results; if (regex_match(text, results, pattern)) { for (auto it = results.begin(); it != results.end(); ++it) cout << *it << endl

  • C++ 正则表达式的应用详解

    目录 一.为什么要学正则表达式 C++string处理: 二.正则程序库(regex) 正则文法: 正则库: 匹配(Match) 搜索(Search) 替换(Replace) 一.为什么要学正则表达式 若要判断一个输入的QQ号是否有效,如何判断? 判断步骤: 长度大于5,小于等于10: 首位不能为0: 是否为纯数字? C++string处理: #include<iostream> using namespace std; int main() { string qq = "7466a

  • C++中正则表达式的使用方法详解

    目录 介绍 1. C++ 中的正则表达式 (Regex) 1.1 范围规范 1.2 重复模式 2. C++正则表达式的例子 3. C++正则表达式中使用的函数模板 3.1 regex_match() 3.2 regex_search() 3.3 regex_replace() 4.C++输入验证 5.总结 介绍 C++ 正则表达式教程解释了 C++ 中正则表达式的工作,包括正则表达式匹配.搜索.替换.输入验证和标记化的功能. 几乎所有的编程语言都支持正则表达式. C++ 从 C++11 开始直接

  • python编程之requests在网络请求中添加cookies参数方法详解

    哎,好久没有学习爬虫了,现在想要重新拾起来.发现之前学习爬虫有些粗糙,竟然连requests中添加cookies都没有掌握,惭愧.废话不宜多,直接上内容. 我们平时使用requests获取网络内容很简单,几行代码搞定了,例如: import requests res=requests.get("https://cloud.flyme.cn/browser/index.jsp") print res.content 你没有看错,真的只有三行代码.但是简单归简单,问题还是不少的. 首先,这

  • Android通过json向MySQL中读写数据的方法详解【读取篇】

    本文实例讲述了Android通过json向MySQL中读取数据的方法.分享给大家供大家参考,具体如下: 首先 要定义几个解析json的方法parseJsonMulti,代码如下: private void parseJsonMulti(String strResult) { try { Log.v("strResult11","strResult11="+strResult); int index=strResult.indexOf("[");

  • Java中正则表达式的使用和详解(下)

    在上篇给大家介绍了Java中正则表达式的使用和详解(上),具体内容如下所示: 1.常用正则表达式 规则 正则表达式语法   一个或多个汉字 ^[\u0391-\uFFE5]+$  邮政编码 ^[1-9]\d{5}$ QQ号码 ^[1-9]\d{4,10}$  邮箱 ^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$  用户名(字母开头 + 数字/字母/下划线) ^[A-Za-z][A-Za-z1-9_-]+$ 手

  • java 中enum的使用方法详解

    java 中enum的使用方法详解 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu

  • Java中正则表达式的使用和详解(上)

    1.匹配验证-验证Email是否正确 public static void main(String[] args) { // 要验证的字符串 String str = "service@xsoftlab.net"; // 邮箱验证规则 String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}"; // 编译正则表达式 Pattern pattern = Pa

  • Android 中RxPermissions 的使用方法详解

    Android 中RxPermissions 的使用方法详解 以请求拍照.读取位置权限为例 module的build.gradle: compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar' compile 'io.reactivex.rxjava2:rxjava:2.0.5' AndroidManifest.xml: <uses-permission android:name="android.permission.AC

  • Android中XUtils3框架使用方法详解(一)

    xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示.相信大家对这个框架也都了解过, 下面简单介绍下XUtils3的一些基本知识. XUtils3一共有4大功能:注解模块,网络

  • Android 中Context的使用方法详解

    Android 中Context的使用方法详解 概要: Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄.很多方法需要通过 Context才能识别调用者的实例:比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用t

  • Android通过json向MySQL中读写数据的方法详解【写入篇】

    本文实例讲述了Android通过json向MySQL中写入数据的方法.分享给大家供大家参考,具体如下: 先说一下如何通过json将Android程序中的数据上传到MySQL中: 首先定义一个类JSONParser.Java类,将json上传数据的方法封装好,可以直接在主程序中调用该类,代码如下 public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String j

随机推荐