[Leetcode] 65 有效数字 / C++正则表达式使用

25 篇文章 0 订阅
16 篇文章 0 订阅

题目:

参考评论中的正则解法:

class Solution {
public:
    //正则表达式解法
    static const regex pattern;
    
    bool isNumber(string s) {
        return regex_match(s,pattern);
    }
};
//正则表达式作为类的静态变量或全局变量,避免重复构造的开销
const regex Solution::pattern("[+-]?(\\d+\\.\\d+|\\d+\\.|\\.\\d+|\\d+)([Ee][+-]?\\d+)?");
  1. 在C++中用正则表达式记得作为类的静态变量或全局变量,避免重复构造的开销,否则会超时。
  2. 将字符串拆成三部分:
    1. 首位正负号,出现最多一次:[+-]?
    2. 底数部分,分为:数字.数字 ,数字. ,.数字 ,数字:(\\d+\\.\\d+|\\d+\\.|\\.\\d+|\\d+)
    3. 指数部分,最多出现一次:([Ee][+-]?\\d+)?
  3. 双斜杠是适合C++03之前的转义效果

C++正则:

C++11默认使用 ECMAScript 文法。常用规则如下:

具有特殊意义的元字符
\:\字符能够改变字符原本的含义

^:^字符指示字符串的头,且要求字符串以字符开头,不占位。\^表示一个真正的^符号。

$:$字符指示字符串的尾,且要求字符串以字符结尾,不占位。\$表示一个真正的$符号。

(...):分组,大正则中包含小正则。可以改变默认的优先级。在模式中可以使用\1来表示第一组已然捕获到的东西。

.:表示一个除了\n以外的任意一个字符。\.表示一个真正的.符号。

|:字符串1|字符串2表示一个字符串,该字符串是字符串1、字符串2中的一个。|在正则中的优先级比较混乱,所以建议加上足够多的括号来分组。

[...]:[字符1字符2字符3...]表示一个字符,该字符是字符1、字符2、字符3……中的某一个。中括号中出现的所有字符都是代表本身意思的字符(没有特殊含义),如[.]只能匹配.符号,而不能匹配任意符号。

[^字符1字符2字符3...]表示一个字符,该字符不是字符1、字符2、字符3……中的任何一个

[a-z]表示一个字符,该字符是a、b、c……z中的某一个

[^a-z]表示一个字符,该字符不是a、b、c……z中的任何一个

\w:表示一个字符,该字符是数字、字母、下划线中的某一个。等价于[(0-9)(a-z)(A-Z)(_)]

\W:表示一个字符,该字符不是数字、字母、下划线中的任何一个。等价于[]

\d : 表示一个字符,该字符是0、1、2……9中的某一个

\D : 表示一个字符,该字符不是0、1、2……9中的任何一个

\s : 表示一个字符,该字符是空白符(空格、制表符、换页符)2、代表出现次数的

\b : 指示字符串的边界(头/尾/空格左/空格右),字符\b要求边界的左边是字符,\b字符要求边界的右边是字符。

量词元字符
*:字符*要求字符出现0到多次

+:字符+要求字符出现1到多次

?:字符?要求字符出现0次或1次

{n}:字符{n}要求字符出现n次

{n,}:字符{n,}要求字符出现n到多次

{n,m}:字符{n,m}要求字符出现n到m次

用法

1.判断匹配:

string str = "hhh233";
regex r("[a-z0-9]+");

// 用法一
bool flag = regex_match(str,r);
// 用法二
bool flag = regex_match(str,regex("\\d+"));
// 用法三
bool flag = regex_match(str.begin()+7,str.end(),regex("\\d+"));


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值