多字节字符是否会干扰正则表达式中的结束行字符?

2024-03-08

使用这个正则表达式:

regex1 = /\z/

以下字符串匹配:

"hello" =~ regex1 # => 5
"こんにちは" =~ regex1 # => 5

但使用这些正则表达式:

regex2 = /#$/?\z/
regex3 = /\n?\z/

他们表现出差异:

"hello" =~ regex2 # => 5
"hello" =~ regex3 # => 5
"こんにちは" =~ regex2 # => nil
"こんにちは" =~ regex3 # => nil

什么是干扰?字符串编码为UTF-8,操作系统为Linux(即$/ is "\n")。多字节字符是否会干扰$/? How?


您报告的问题肯定是一个错误Regexp of RUBY_VERSION #=> "2.0.0"但在以前的 1.9 中已经存在,当时编码允许多字节字符,例如__ENCODING__ #=> #<Encoding:UTF-8>

不依赖于 Linux,也可以在 OSX 和 Windows 中重现相同的行为。

一会儿bug 8210 http://bugs.ruby-lang.org/issues/8210将被修复,我们可以提供帮助隔离 and 理解出现问题的情况。 这对于任何解决方法当适用于具体情况时。

据我了解,问题发生在以下情况:

  • 之前搜索过一些东西字符串结尾 \z.
  • 字符串的最后一个字符是多字节.
  • 和之前的搜索使用零或一图案?
  • 但数量零或一搜索的字符数少于bytes最后一个字符的。

该错误可能是由于正则表达式引擎实际检查的字节数和字符数之间的误解造成的。

一些例子可能会有所帮助:

测试 1:其中最后一个字符:“は”是 3 个字节:

s = "んにちは"

在字符串结尾之前测试 ん [3 个字节] 中的零个或一个:

s =~ /ん?\z/u   #=> 4"       # OK it works 3 == 3

当我们尝试使用 ç [2 个字节]

s =~ /ç?\z/u   #=> nil       # KO: BUG when 3 > 2
s =~ /x?ç?\z/u #=> 4         # OK it works 3 == ( 1+2 )

当测试 \n [1 个字节] 中的零个或一个时

s =~ /\n?\z/u #=> nil"      # KO: BUG when 3 > 1
s =~ /\n?\n?\z/u #=> nil"   # KO: BUG when 3 > 2
s =~ /\n?\n?\n?\z/u #=> 4"  # OK it works 3 == ( 1+1+1)

根据 TEST1 的结果我们可以断言:如果字符串的最后一个多字节字符是 3 个字节,那么“之前的零个或一个”测试仅在我们之前测试至少 3 个字节(而不是 3 个字符)时才有效。

测试 2:最后一个字符在哪里"ç"是2个字节

s = "in French there is the ç" 

检查 ん [3 字节] 中的零个或一个”

s =~ /ん?\z/u #=> 24        # OK 2 <= 3

检查 é [2 字节] 中是否有零个或一个

s =~ /é?\z/u #=> 24         # OK 2 == 2
s =~ /x?é?\z/u #=> 24       # OK 2 < (2+1)

测试 \n [1 个字节] 中的零个或一个

s =~ /\n?\z/u    #=> nil    # KO 2 > 1  ( the BUG occurs )
s =~ /\n?\n?\z/u #=> 24     # OK 2 == (1+1)
s =~ /\n?\n?\n?\z/u #=> 24  # OK 2 < (1+1+1)

根据 TEST2 的结果我们可以断言:如果字符串的最后一个多字节字符是 2 个字节,那么“之前的零个或一个”测试仅在我们检查之前至少有 2 个字节(而不是 2 个字符)时才有效。

当多字节字符不在字符串末尾时,我发现它可以正常工作。

公共要点与我的测试代码可用在这里 https://gist.github.com/anonymous/5339185

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多字节字符是否会干扰正则表达式中的结束行字符? 的相关文章

随机推荐

  • ios 标签栏自定义图像

    我在工作ios我需要定制的应用程序tabbar像是this http postimage org image jxm57t89j 首先我创建了5个viewcontrollers导航控制器中的每一个 然后把它们放进去tabbbarcontro
  • Symfony onFlush Doctrine 监听器

    嗨 我有一个 onFlush 监听器
  • 在新窗口中打开图像

    如何使用其在新窗口中打开图像id function swipe var largeImage document getElementById largeImage largeImage style display block largeIm
  • 更改Android自定义SurfaceView的大小

    我正在尝试为 Android 应用程序创建 2D 游戏引擎 我已经关注了本教程 http www droidnova com 2d tutorial series part ii 772 html 这对于创建全屏显示效果很好 但我不想要这样
  • servicestack ormlite 中的分页

    我正在寻找一种在 ormlite 中实现分页的好方法 我发现了另一种question https stackoverflow com questions 15705419 passing params expression results
  • 从 Intent.createChooser 获取选择的应用程序

    我正在尝试捕捉结果Intent createChooser了解用户选择共享哪个应用程序 我知道有很多与此相关的帖子 如何知道用户在使用意图选择器时选择了哪个应用程序 https stackoverflow com questions 106
  • Filemaker GetAs...如何在网页上显示容器字段?

    我有一个 ASP Net 应用程序 需要显示存储在 Filemaker 容器字段中的图像 我的查询语句如下所示 SELECT GetAs Image JPG FROM UA Item Pictures WHERE Stock Number
  • PyGame Space Invaders 游戏 - 让外星人一起移动

    我已经使用 PyGame 模块在 Python 中创建了一个 Space Invaders 克隆 但是当它们到达游戏屏幕边缘时 让它们一起向下移动时遇到了一些困难 当外星人到达游戏屏幕边缘时 我该如何做到这一点 他们都同时改变方向并下降一个
  • 多对一,全部删除孤儿,将属性设置为 null 但实体未删除

    使用 NHibernate v3 0 我有一个与此类似的课程 class Foo bool barActive Bar bar Bar 实例完全由 Foo 内部管理 当 barActive 为 true 时 bar 被设置为 Bar 实例
  • makePrimss 的用例和示例

    我不清楚 makeLense 和 makePrisms 之间的区别 我知道当我们想要访问嵌套结构 数据时 请像这样使用 makeLense data Point Point x Int y Int data Test Test name S
  • 螺纹扭曲...如何正确使用它们?

    我需要编写一个运行两个线程的简单应用程序 线程 1 按定时运行 假设每 1 分钟运行一次 线程 2 只是一个执行 操作 的 正常 while True 循环 如果不是按定时间隔运行的要求 我根本不会考虑扭曲 但简单的 sleep 60 还不
  • ImageIO 对原始图像的支持 (jrawio)

    我一直在寻找原始图像支持 并找到了这个库 jrawio 1 6 1 它扩展了 imageio 以添加原始支持 它似乎有效 但速度非常慢 我见过跑得更快的蜗牛 我的代码在几秒钟内处理 Jpeg 而处理一个不太大的 cr2 文件或 nef 则需
  • 如何使用 UIButtonBarItem 触发方法?

    我有一个带有工具栏的 xib 上面有 2 个按钮 全部用 IB 制作 我可以将插座连接到按钮 但是当我单击它们时 该方法不会被触发 这是为什么 在我的头文件中我有这个 property nonatomic retain IBOutlet U
  • WinExec 和 ShellExecute 之间有哪些区别?

    我需要执行另一个应用程序 我想知道我是否应该使用WinExec代替ShellExecute或相反亦然 两种方法有哪些区别 有应该优先选择的吗 WinExec长期以来已被弃用 仅出于向后兼容性的原因而保留 它用于启动可执行文件 不要使用它 因
  • 使用ajax调用php并返回多个变量?

    我正在尝试使用 javascript 调用 php 脚本 然后该脚本会将多个变量返回给我的 javascript 以便我可以操作它们 这是我的JS ajax url test php data id lastFileId success f
  • 使用 escaped_list_separator 和 boost split

    我正在使用 boost 字符串库 刚刚发现 split 方法非常简单 string delimiters string str string with comma delimited tokens and delimiters inside
  • R将EXIF数据写入JPEG文件

    对于 R 我发现有机会只读取 EXIF 数据 R 中是否有可能将 EXIF 数据写入 JPEG 文件 感谢所有回复的人 结果 我得到了以下解决方案 Install ExifTool https sno phy queensu ca phil
  • 从查找表创建新变量

    我的数据集中有以下列 presult aresult I single I double I triple I home run SS strikeout 我想添加第三列 bases 它取决于列 areresult 中结果的值 例如 我希望
  • SASS 文件内链接的缓存清除图像

    我对 Laravel 5 0 相当陌生 但对 PHP 不太熟悉 我一直在使用 Elixir 来编译我的 SASS 从我的资源目录复制图像并通过mix version防止缓存的功能 然而 这对于 CSS 图像和 JavaScript 来说非常
  • 多字节字符是否会干扰正则表达式中的结束行字符?

    使用这个正则表达式 regex1 z 以下字符串匹配 hello regex1 gt 5 regex1 gt 5 但使用这些正则表达式 regex2 z regex3 n z 他们表现出差异 hello regex2 gt 5 hello