首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用正则表达式高效地测试"EndsWith“

使用正则表达式高效地测试"EndsWith“
EN

Stack Overflow用户
提问于 2010-01-17 15:58:57
回答 5查看 21.4K关注 0票数 12

我需要构建一个正则表达式(.NET语法)来确定字符串是否以特定值结尾。具体地说,我需要测试文件是否具有特定的扩展名(或一组扩展名)。

我试图修复的代码使用的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.*\.(png|jpg|gif)$

在我的场景中,对于失败的匹配,这是非常慢的(可能是由于回溯。

只需在开始时删除.* (这很好,因为API只测试匹配项,而不提取任何内容),就可以使正则表达式更高效。

它仍然感觉它的效率很低。我是不是漏掉了什么明显的东西?

不幸的是,我不能控制有问题的API,所以我需要一个正则表达式来做这件事,尽管我通常不认为正则表达式是适合这项工作的工具。

我还使用RegexOptions.RightToLeft做了一些测试,发现使用^.*\.(png|jpg|gif)$可以提高测试用例的性能,但是我找不到在正则表达式本身的字符串中指定RightToLeft选项的方法,所以我不认为可以使用它。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-17 16:19:23

我没有访问C#的权限,所以我不能尝试...但是你应该能够避免太多的回溯,通过强制引擎首先找到字符串的结尾,然后匹配扩展名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$(?<=\.(gif|png|jpg))

不过,我不确定后视对性能有什么影响。

票数 16
EN

Stack Overflow用户

发布于 2010-01-18 01:47:13

实际上,你也可以完全放弃正则表达式,使用String.EndsWidth,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var extensions = new String[] { ".png", ".jpg", ".gif" };
extensions.Any(ext => "something".EndsWith(ext));

我通常有这样的感觉,在这样的情况下,使用简单的字符串函数最终会更快,而不是试图找到一种聪明的方法来使用有效的正则表达式,在运行时和/或开发时间方面,除非您熟悉并知道什么是有效的正则表达式。

票数 7
EN

Stack Overflow用户

发布于 2010-01-17 16:12:34

使其专门查找句点,而不是扩展名之前的任何字符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\.(png|jpg|gif)$

这将使它更安全(不会与x.xgif匹配),并且在找到句点之前,它根本不需要进行任何回溯(而不是对每个字符进行回溯)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2081555

复制
相关文章
C++:43---派生类向基类转换、静态/动态的类变量
一、继承中类的类型转换规则 我们普通的编程规则规定,如果我们想把引用或指针绑定到一个对象上,则引用或指针的类型必须与所绑定的对象的类型一致或者对象的类型含有一种可接受的const类型转换规则。但是继承关系中的类比较例外,其规则如下: ①我们可以将基类的指针或引用绑定到派生对象上 #include <iostream>class A {};class B:public A{};int main(){ A *a; B b; a = &b; return 0;} ②即使不是指针/引用类型,我们也可以将派生类转换为
用户3479834
2021/02/03
1.8K0
C++:43---派生类向基类转换、静态/动态的类变量
scala(十一) 派生类与派生对象
Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。
用户1483438
2022/04/15
5250
CWnd的派生类-3、CDialog类
对话框与普通窗口的区别仅在于,对话框是通过对话框模板建立起来的。只需要一个以模板为实参的创建命令,如CDialog::Create(),就可以完成对话框窗口及其子控件的创建工作,所有创建细节都由对话框模板来指示。而对于普通窗口,窗口及其包含的子控件必须逐一创建,而且要指定窗口风格等详细参数。对话框是最基本的可视化编程方法,一个应用程序往往包含众多的对话框资源模板和封装类,而普通窗体(包括框架窗体)却寥寥无几。但对话框的使用,只是方便了窗体和控件的创建过程,其本质与普通窗体无任何区别。
全栈程序员站长
2022/07/05
1.3K0
基类和派生类
  在面向对象设计中,被定义为包含所有实体共性的class类型,被称为“基类”。-百度百科
全栈程序员站长
2022/09/20
1K0
派生类的构造过程
1、先基类、后对象、再子类 多继承,初始化顺序跟基类的声明顺序有关,从左到右。 对象 ,与声明类的顺序有关,从上到下。
我与梦想有个约会
2023/10/20
1440
派生类的构造过程
C++中类,对象,封装,继承(派生),多态
类就是同一类事物的总称,比如我(一个对象)可以讲话,那么基本上所有人都具备这个属性,就将我这一类的对象称为类,类的思想就是这样产生的。更恰当的描述:类就是世间事物的抽象称呼,而对象就是这个事物相对应的实体,人类就是一个类,写博文的我,看博文的你就是人类这个类的实例化,这也是为什么人类里面有个类,动物类,植物类,都有一个类,单说一个动物类,我们只能知道是动物,,却无法确定是那种动物,而对象就是具体实例化动物。在C++语言中,类中对象的行为是以函数(方法)的形式定义的,对象的属性是以成员变量的形式定义的,而类包括对象的属性和函数。
花狗Fdog
2022/01/11
1.1K0
C++中类,对象,封装,继承(派生),多态
C++ 类的继承与派生
本文探讨了C++类的继承与派生,介绍了不同的继承方式,包括公有继承、私有继承和保护继承,并说明了C++中类的多态性。同时,文章还介绍了一种在派生类中访问基类成员的方法,即使用作用域解析运算符“.”。此外,文章还介绍了C++中的虚函数和纯虚函数,并说明了C++中的接口和抽象类。
chaibubble
2018/01/02
1.1K0
从TypeScript的类中派生接口[每日前端夜话0xAE]
大多数面向对象编程语言都鼓励编程到接口【https://tuhrig.de/programming-to-an-interface/】的模式。TypeScript 当然支持这一点,你可以创建一个或多个接口,然后再定义生成这个接口实例的类(或工厂)。
疯狂的技术宅
2019/08/23
8470
从TypeScript的类中派生接口[每日前端夜话0xAE]
继承、派生、新式类与经典类
Downwards is the only way forwards .——《盗梦空间》
GH
2019/12/12
5730
类与对象,类的继承,类的派生,类的组合,多态
在python中先有类再有对象,类和对象,你可以看成,类是把对象的相同特征和相同方法汇总再一起,再根据类来生成对象,这个对象具有类的特征与方法
小小咸鱼YwY
2019/07/24
1.2K0
Python使用元类约束派生类中必须实现指定的成员
创建派生类时指定元类,用来控制和约束派生类的创建过程,对派生类中的成员进行一定的限制。
Python小屋屋主
2021/12/29
9830
Python使用元类约束派生类中必须实现指定的成员
Python中类变量、成员变量、局部变量的区别
class A:v1 = 100 # 类变量def __init__(self):self.v2 = 200 # 成员变量v3 = 300 # 局部变量类变量可以由类名统一修改:A.v1 = 300# 则每一个A实例里v1都变成300成员变量只能由实例自己改变:A.v2 # 这个是错的。a = A()a.v2 # 这个是可以访问的。局部变量只在函数内部生效
狼啸风云
2020/10/16
4.4K0
基类派生类多态虚函数?
通常在层次关系的根部有一个基类,其他类则直接或间接的从基类继承而来,这些继承得到的类称为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。
洁洁
2023/10/10
1970
c++-基类与派生类
友元函数必须在类中进行声明而在类外定义,声明时须在函数返回类型前面加上关键字friend。友元函数虽不是类的成员函数,但它可以访问类中的私有和保护类型数据成员。
kdyonly
2023/03/03
3930
java中类变量和实例变量的实质区别
相对于static(静态的)或说类的, 本章开始提到的都是instance(实例的)或说对象的。 每个对象都有自己的一份儿对象域或实例域,相互之间没关系, 不共享。 我们可以从对象中访问实例变量。
马克java社区
2021/03/15
2K0
java中类变量和实例变量的实质区别
虚拟变量在模型中的作用
实际场景中,有很多现象不能单纯的进行定量描述,只能用例如“出现”“不出现”这样的形式进行描述,这种情况下就需要引入虚拟变量。例如即将到来的女生节,每年的这个时候毛绒玩具的销量都会上升,说明女生节对毛绒玩具的销量产生了一定影响,但是这个影响程度又很难界定,这时只能定义一个虚拟变量去描述事情“发生”与“不发生”了。
许卉
2019/07/15
4.3K0
解决cpp添加QObject派生类的问题
一般我们继承QObject类在头文件中添加,但是有时候需要在源文件中添加。这样就会不可避免地出现编译错误。那么我们该究竟怎么解决它呢? 问题重现 执行下列源码会报以下错误: error: undefined reference to `vtable for Object' 错误: 未定义引用'Object'的虚函数表 问题源码: /* main.cpp */ #include <QCoreApplication> class Object : public QObject { Q_OBJECT p
Qt君
2019/07/15
1.8K0
C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等
从people(人员)类派生出student(学生)类 添加属性:班号char classNO[7];从people类派生出teacher(教师)类, 添加属性:职务char principalship[11]、部门char department[21]。 从student类中派生graduate(研究生)类,添加属性:专业char subject[21]、 导师char teacher_adviser[21];从graduate类和teacher类派生出TA(助教生)类, 注意
Enterprise_
2019/03/01
1K0
C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等
C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等
从people(人员)类派生出student(学生)类 添加属性:班号char classNO[7];从people类派生出teacher(教师)类, 添加属性:职务char principalship[11]、部门char department[21]。 从student类中派生graduate(研究生)类,添加属性:专业char subject[21]、 导师char teacher_adviser[21];从graduate类和teacher类派生出TA(助教生)类, 注意虚基类
Enterprise_
2018/05/18
2.6K0
c++继承 基类 派生类 虚函数
类和类的关系有组合、继承和代理。继承的本质就是代码复用。子类继承父类中的一些东西,父类也称为基类,子类也称为派生类。派生类继承了基类除构造函数以外的所有成员。
用户7886150
2021/02/03
1.1K0

相似问题

UCanAccess调用保存的追加、更新或删除查询

10

TLA+中序列元素和集合元素的比较

10

尾递归调用尾递归

24

Kotlin -A函数被标记为尾递归,但没有发现尾调用。

27

如何实现尾递归列表追加?

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文