正则表达式“punct”字符类根据 Ruby 版本匹配不同的字符

2023-11-27

Ruby 的字符类标点符号, i.e. [:punct:], \p{Punct}, or \p{P}似乎根据我使用的 Ruby 版本匹配不同的字符。

这是一个小例子:(很抱歉弄乱了 SO 的语法荧光笔)

# punct.rb
chars = <<-EOD.split
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~
EOD

matched, not_matched = chars.partition { |c| c =~ /[[:punct:]]/ }

puts "    matched: #{matched.join}"
puts "not matched: #{not_matched.join}"

使用 Ruby 1.9.3 和 Ruby 2.4.0 我得到:

    matched: !"#$%&'()*+,-./:;<=>?@[]^_`{|}~
not matched:

但是中间的各种 Ruby 版本(2.0.x、2.1.x、2.2.x、2.3.x)给了我:

    matched: !"#%&'()*,-./:;?@[]_{}
not matched: $+<=>^`|~

为什么会发生这种情况以及正确的行为是什么?更重要的是:如何在 Ruby 版本之间获得一致的结果?

尝试更改我的区域设置无济于事(按照建议为什么 Ruby /[[:punct:]]/ 会丢失一些标点符号?).


Ruby 1.9.3 使用 US_ASCII 作为默认编码,它可以正确匹配所有标点符号。 Ruby 2.0 将其默认编码切换为 UTF-8,引入了您发现的错误,该错误导致标点符号匹配不正确。 Ruby 2.4 修补了这个错误。

正确的行为是匹配所有标点符号,就像 ruby​​ 1.9.3 和 2.4 那样。这与 POSIX 正则表达式对标点符号的定义一致。

使代码一致的一种选择是将所有字符串编码为 US_ASCII 或不存在 UTF-8 错误的替代方案:

matched, unmatched = chars.partition { |c| c.encode(Encoding::US_ASCII) =~ /[[:punct:]]/ }

但这可能是不可取的,因为它迫使您对字符串使用限制性编码。

另一种选择是手动定义标点符号:

/[!"\#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~]/

这有点不优雅,但您可以将其放入变量中并以这种方式将其添加到正则表达式中:

punctuation = "[!\"\#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~]"
my_regex = /#{punctuation}/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式“punct”字符类根据 Ruby 版本匹配不同的字符 的相关文章

  • 无需别名的 Ruby YAML 编写

    我正在从 ruby 将数据写入 yaml 文件 并且经常在该文件上添加别名 像 id001 somekey somevalue id001 就我而言 我使用 yaml 文件来aid可读性并将名称添加到文件中的值 因为现有数据只是 没有键的分
  • RewriteCond REQUEST_URI - ^ 未按预期工作

    我正在 codeigniter 中构建一个网站 我在 htaccess 文件中有一系列重写条件和规则 第一组规则根据 uri 的第一段打开或关闭 SSL 然后它再次循环 如果找到匹配项 则适当地重定向页面 如果没有匹配项 并且 uri 不以
  • 至少 6 个字符正则表达式 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在寻找至少检查 6 个字符的正则
  • 我可以缩短这个正则表达式吗?

    我需要检查字符串是否符合特定的 ID 格式 ID的格式如下 aBcDe fghIj KLmno pQRsT uVWxy 由五个大写或小写字母组成的五个块的序列 由一个破折号分隔 我有以下有效的正则表达式 string idFormat a
  • 在Python中检测re(regexp)对象

    我想知道什么是正确的 pythonic 向后和向前兼容的方法如何检查对象是否已编译re object isinstance方法不能轻易使用 而生成的对象声称是 sre SRE Pattern object gt gt gt import r
  • 为什么 rand() 总是返回相同的数字?

    我在用 兰特 200 在我的 Rails 应用程序中 当我在控制台中运行它时 它总是返回随机数 但如果我在应用程序行中使用它 index rand 200 索引总是相同的号码 为什么会这样以及如何克服这个问题 简单的伪随机数生成器实际上生成
  • Java中字符串中特殊字符的替换

    Java中如何替换字符串 E g String a adf sdf 如何替换和避免特殊字符 您可以删除除此之外的所有字符可打印的 ASCII 范围 http en wikipedia org wiki ASCII ASCII printab
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • JavaScript RegEx:不同的结果:使用字符串和使用正则表达式“文字”构建模式?

    使用 RegExp 文字与字符串之间有什么区别吗 http jsfiddle net yMMrk http jsfiddle net yMMrk String prototype lastIndexOf function pattern p
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 在 Mac OS X 10.6.8 中手动编译 Ruby 时,GEM 在哪里?

    我在 Snow Leopard 上手动构建了 Ruby 1 9 2 现在我找不到我的旧 GEM 文件了 我猜他们现在正走在不同的道路上 所以我有三个问题 什么是 旧 宝石路径 在哪里gem install sinatra把西纳特拉宝石 当我
  • 两个 ruby​​ 进程之间的通信可能/容易吗?

    如果我有一个 ruby 脚本Daemon顾名思义 它作为守护进程运行 监视系统的某些部分并能够执行需要身份验证的命令 例如更改权限 是否有一种简单的方法来拥有第二个 ruby 脚本 例如client 与该脚本通信并向其发送命令 询问信息 我
  • 检查rails devise ldap gem中的组成员身份,是否在yaml中?

    我是否应该使用 ldap yml 文件来确保使用 ldap 进行身份验证的人拥有分配给他们的正确组以允许他们进入 无论如何 我都不是 AD 专业人士 这让我很困惑 什么是组和属性 据我了解 我们在 AD 中有一个用户 他们有一个 samAc
  • Perl 非贪婪

    我遇到非贪婪正则表达式 regex 的问题 我已经看到有关于非贪婪正则表达式的问题 但它们没有回答我的问题 Problem 我正在尝试匹配 lol 锚点的 href Note 我知道这可以通过 Perl HTML 解析模块来完成 我的问题是
  • 如何使用 Ruby on Rails 3 检查 HTTP 请求的“Content-Length”字段?

    我正在使用 Ruby on Rails 3 在我的视图文件中我有以下代码 为了避免服务器过载 我会在服务器接收上传文件之前检查上传文件的大小 这是因为 按下表单的提交按钮 服务器会先完整接收文件 然后再检查文件 我知道一个HTTP 请求有标
  • Emacs、ruby:将 do 结束块转换为大括号,反之亦然

    我经常发现自己转换这样的代码 before do something end to before something 有没有办法在 emacs 中自动执行此任务 我使用 ruby mode 和 rinary 但它们在这里没有太大帮助 rub
  • 在 mac os Sierra 上,卡在“设置 CocoaPods 主存储库”上

    转移到 mac os sierra 后 我完全格式化了我的 mac 现在每次运行时我都面临安装 cocoapods 的问题sudo gem install cocoapods pre一切都安装得很好 当我尝试安装 Pod 时 终端堆栈打开S
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional

随机推荐

  • 构造函数可以是异步的吗?

    我有一个项目 我试图在构造函数中填充一些数据 public class ViewModel public ObservableCollection
  • 如何处理 Java/Android 中的慢速网络连接

    我有一个应用程序需要多次调用 MySQL 数据库 它在一个AsyncTask 下面是一个可能看起来像的示例 我的主要问题是这样的 有时 主机 Godaddy 呃 决定停止连接 而我的progressDialog加载 加载 加载更多 直到强行
  • 如何在android中使用SearchView小部件时突出显示过滤后的文本

    我已经实施了SearchView我的应用程序中的小部件 它工作正常 现在我需要做的是 每当我在我的SearchView Bar 过滤结果应突出显示搜索的单词 喜欢 我正在用这个搜索视图小部件为 Override public void on
  • Twitter:在 C# 中验证用户名和密码

    赏金问题 我正在使用 c 3 5 窗口窗体应用程序 我正在使用已接受的答案中提到的代码 我收到以下错误 远程服务器返回错误 401 未经授权 验证用户名和密码的示例代码将非常感激 赏金问题结束 我有一个具有以下用例的应用程序 当用户第一次开
  • 打算在Android上启动时钟应用程序

    我制作的时钟小部件遇到问题 我希望用户触摸时钟并启动手机上的时钟应用程序 这是代码 this worked on my nexus 2 1 if VERSION SDK equals 7 RemoteViews views new Remo
  • QML 条件绑定未按预期工作

    如果我有一个简单的Binding形式的对象 Rectangle height 400 width 500 property var someObj null Binding on color when someObj value someO
  • TypeError:只能将 str (不是“NoneType”)连接到 str

    尝试在 Python 3 7 中构建一个大写到小写的字符串转换器 这是我的代码 def convertChar char if char gt A and char lt Z return chr ord char 32 def toLow
  • 如果刷新 AJAX 请求的内容 (ob_flush),内容会被加载吗?

    我的意思是 让我们发出一个 AJAX 请求并将结果插入到 div result 中 在后端脚本使用ob flush 发送标头 但在请求终止之前不终止请求 使用exit or ob flush end 仅当请求终止时 内容才会加载到 resu
  • Unity中序列化和反序列化Json和Json数组

    我有一个从 PHP 文件发送到 unity 的项目列表WWW The WWW text好像 playerId 1 playerLoc Powai playerId 2 playerLoc Andheri playerId 3 playerL
  • 根据 的状态设置

    仅使用 CSS 是否可以根据输入的状态来设置 HTML 标签的样式 就我而言 我想要设计一个
  • 按第二项(整数值)对元组列表进行排序[重复]

    这个问题在这里已经有答案了 我有一个元组列表 看起来像这样 abc 121 abc 231 abc 148 abc 221 我想按元组内的整数值升序排列此列表 是否可以 尝试使用key的关键字参数sorted 默认按升序排序 sorted
  • 球拍博士中的 mcons

    我在读取球拍博士的输出时遇到问题 默认情况下 它使用 mcons 显示列表 例如 sicp 练习 2 32 生成 gt subsets list 1 2 3 mcons mcons mcons mcons 3 mcons mcons 2 m
  • 通过 Xpath 查找包含文本的元素

    如果我搜索单个字符串 这效果很好 var element Driver FindElement By XPath a contains text About us 但我可以有一个or语句如下面的示例所示 var element Driver
  • 一个视图控制器中的两个 TableView [重复]

    这个问题在这里已经有答案了 我有一个按钮和两个按钮tableViewControllers在一个视图控制器中 因此 如果我按下该按钮 第一个表视图控制器将出现 并且它将按行显示一些数据 如果我选择第一个表视图控制器中的任何行 第二个表视图控
  • 使用 Yii 重定向访问规则

    我正在做一个需要身份验证的应用程序 在应用程序的索引页面中 我指定了这样的访问规则 public function accessRules return array array deny actions gt array index reg
  • iPhone - 如何从应用程序保存用户设置?

    将 iPhone 应用程序中的几个变量保存到长期内存中的最简单方法是什么 我有一个可与不同 sqlite 数据库配合使用的应用程序 我希望在退出应用程序后保存最后一个活动数据库名称 以便在用户再次进入应用程序时打开最后一个数据库 为此目的创
  • 为什么此 F# 函数需要括号?

    为什么需要括号read rest of csv below let read rest of csv csv data Add csv fileH ReadFields gt ignore not csv fileH EndOfData w
  • WPF ListView 对列单击进行排序

    我有一个列表视图 其中的项目在运行时以具有单列 多列的网格形式添加 现在我需要让排序工作 一旦列表视图中有项目并且他们单击该列 它应该在该列上对其进行排序 下面是列表视图的代码
  • 在 ConvertBack() 方法中获取 WPF 绑定中 IValueConverter 实现的 Source 值

    我将依赖属性绑定到 WPF 中的 textboxex 该属性是一个字符串 其中一些值由 分隔 例如 1 2 3 4 我需要将各个值绑定到单独的文本框 这对于以下实现来说很好Convert method public object Conve
  • 正则表达式“punct”字符类根据 Ruby 版本匹配不同的字符

    Ruby 的字符类标点符号 i e punct p Punct or p P 似乎根据我使用的 Ruby 版本匹配不同的字符 这是一个小例子 很抱歉弄乱了 SO 的语法荧光笔 punct rb chars lt lt EOD split l