【问题标题】:Redefining the Word Character Class in Perl在 Perl 中重新定义 Word 字符类
【发布时间】:2015-10-14 19:30:15
【问题描述】:

我需要在 Perl 中更改 \w 字符类的行为。我希望它匹配[a-zA-Z0-9_.]。也就是说,我想在字符类中添加.。这可能吗?

我需要修改\w,因为我想要一些模块(例如Getopt::Long)将“foo.bar”之类的内容视为有效词。

【问题讨论】:

  • 我认为不可能。为什么不使用[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+)*
  • 正如mbethke 所描述的,这是一件非常丑陋的事情。如果您解释了您要解决的问题,或许我们可以为您提供更好的帮助?
  • 如问题中所述,一个示例是使Getopt::Longfoo.bar 识别为有效的选项规范。
  • @KevinVW:是的,但你为什么要那样做?选项规范纯粹是 Perl 程序本地的,不需要外部匹配任何东西
  • 与作者对话;他们可能愿意为您添加.

标签: regex perl


【解决方案1】:

无法更改预定义字符类的含义。但是,您可以使用[\w.] 构建自己的

【讨论】:

  • 这正是我要说的,直到我浏览了你的帖子。
【解决方案2】:

这就是全部 a) 未经测试 b) 非常讨厌 c) 不方便 所以它应该是一个评论,可惜我还不能写。

我只看到两种可能性:

  • 编写自定义语言环境 \w 类使用use locale 下的LC_CTYPE 来确定哪些字符被视为“单词字符”。 perllocale 手册页提到作为安全方面

    使用“\w”对安全文件名或邮件地址进行正则表达式检查可能会被声称“>”和“|”等字符的“LC_CTYPE”语言环境所欺骗是字母数字。

不幸的是,如果不安装系统全局配置,似乎没有办法做到这一点(至少在 Unixish 操作系统上,不知道 Windows)。 Askubuntu 有一个关于这个的帖子。

  • 猴子补丁所需的功能。如果您不知道用户可能拥有的要修补的模块的相应版本(尽管您可以使用您的脚本),这会打开一个不同的蠕虫罐。

总而言之,做这样的事情最好三思而后行,它很可能会破坏系统的其他部分,并且无论如何它都会使维护成为一场噩梦。

【讨论】:

  • "Monkey-patch the required functions" 据我所知,这需要编辑和重建 Perl 解释器
  • @Borodin:抱歉,我并不清楚——我的意思是Getopt::Long 中的函数等,OP 希望通过更改后的\w 表现出不同的行为。
  • 我最终只是在我的项目的 lib 目录中制作模块的本地副本并修补它们。这样我就可以确定我的补丁版本被使用了。最终只有少数模块需要我的补丁。
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 2015-03-26
  • 2011-03-26
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多