regex - 如何验证用户输入中的 Perl 正则表达式?
问题描述
我从假设有效的 perl 正则表达式值的用户那里得到一个输入列表。示例可能是:
\b[Bb]anana\b
\s*Apples[BANANA]\s+
有没有一种安全的方法来验证这些字符串?
解决方案
首先,考虑您想让用户对模式进行多少操作。Perl 正则表达式可以运行任意代码。
但是,要验证您可以将字符串用作模式而不会导致致命错误,您可以使用qr//
运算符编译字符串并返回正则表达式。如果有问题,qr
会给你一个致命的错误,你可以用它来捕捉eval
:
my $pattern = eval { qr/$input/ };
如果您返回undef
,则该模式无效。而且,尽管问题中有评论,但仍有无数种方法可以制作无效模式。我知道,因为我一直手动输入它们,而且我还没有用尽办法搞砸:)
这不会将模式应用于字符串,但您可以使用它$pattern
来进行匹配:
if( $pattern ) {
$target =~ $pattern; # or $target =~ m/$pattern/
}
推荐阅读
- typescript - 使用扩展语法以创建对象的新实例时如何删除对象的属性?
- java - 休息可以 MediaType.MULTIPART_FORM_DATA 与 @Produces 一起使用
- node.js - 客户端-服务器 websocket
- r - 基于使用函数的某些计算在数据框中创建附加列时出错
- c# - 如果我使用 PlayerPrefs 或 Serializedfield 创建它,我想统一为我的 2D 游戏创建内部商店
- java - 如何获取 JNA 结构数组的 c 指针
- c# - 在 ASP.NET Core 中使用 HttpClient 或 WebRequest 远程异步逐行读取文件内容会更好吗?
- anychart - 检查 rowClick 事件中点击了哪一列
- r - 如何加快R中的非线性优化过程
- report - 如何从一次 ROBOT 测试执行中获得多个报告?