\G 在 .split 中如何工作?

2023-11-21

我喜欢用 Java 进行代码高尔夫(尽管 Java 过于冗长而缺乏竞争力),即用尽可能少的字节完成某个挑战。在我的一个答案中,我有以下代码:

for(var p:"A4;B8;CU;EM;EW;E3;G6;G9;I1;L7;NZ;O0;R2;S5".split(";"))

在我们将 2 个字符的字符串转换为字符串数组后,它基本上会循环.split。有人建议我可以用这个来节省 4 个字节:

for(var p:"A4B8CUEMEWE3G6G9I1L7NZO0R2S5".split("(?<=\\G..)"))

功能还是一样的。它循环遍历 2 个字符的字符串。

然而,我们都不能 100% 确定这是如何工作的,因此提出了这个问题。


我知道的:

I know .split("(?<= ... )")用于分割,但保留尾部分隔符。
还有一种方法可以保留前导分隔符或分隔符作为分隔项:

"a;b;c;d".split("(?<=;)")            // Results in ["a;", "b;", "c;", "d"]
"a;b;c;d".split("(?=;)")             // Results in ["a", ";b", ";c", ";d"]
"a;b;c;d".split("((?<=;)|(?=;))")    // Results in ["a", ";", "b", ";", "c", ";", "d"]

I know \G is used to stop after a non-match is encountered.
EDIT: \G is used to indicate the position where the last match ended (or the start of the string for the first run). Corrected definition thanks to @SebastianProske.

int count = 0;
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("match,");
java.util.regex.Matcher matcher = pattern.matcher("match,match,match,blabla,match,match,");
while(matcher.find())
  count++;
System.out.println(count); // Results in 5

count = 0;
pattern = java.util.regex.Pattern.compile("\\Gmatch,");
matcher = pattern.matcher("match,match,match,blabla,match,match,");
while(matcher.find())
  count++;
System.out.println(count); // Results in 3

但如何.split("(?<=\\G..)")使用时准确工作\G分裂里面?
为什么会这样.split("(?=\\G..)")不行?

这里有一个“在线尝试”链接,其中包含上述所有代码片段,以查看它们的实际效果。


如何.split("(?<=\\G..)") work

(?<=X)是 X 的零宽度正向后查找。\G是上一场比赛的结束(不是某种停止指令)或输入的开始,当然..是两个单独的字符。所以(?<=\G..)是上一个匹配末尾的零宽度回顾加上两个字符。既然这是split我们正在描述一个分隔符,使整个事情成为零宽度断言意味着我们只用它来识别在哪里中断字符串,而不是实际消耗任何字符。

那么让我们来看看ABCDEF:

  1. \G匹配输入的开头,并且..火柴AB, so (?<=\G..)找到之间的零宽度空间AB and CD因为这是一个回顾:也就是说,第一个点\G.. prior正则表达式光标是之间的点AB and CD。所以分为AB and CD.
  2. \G标记之后的位置AB so (?<=\G..)找到之间的零宽度空间CD and EF,因为当正则表达式光标向前移动时,这是第一个地方\G..火柴:\G匹配之间的位置AB and CD and ..匹配CD。所以分为CD and EF.
  3. 又一样:\G标记之后的位置CD so (?<=\G..)找到之间的零宽度空间EF和输入结束。所以分为EF和输入结束。
  4. 创建一个数组,其中包含除末尾的空匹配项之外的所有匹配项(因为这是split带有隐含的length = 0它会丢弃最后的空字符串)。

Result { "AB", "CD", "EF" }.

为什么会这样.split("(?=\\G..)")不行?

Because (?=X)是一个积极的样子ahead。上一场比赛永远不会结束ahead正则表达式游标的。只能是behind it.

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

\G 在 .split 中如何工作? 的相关文章

随机推荐

  • 在 Python 中从 Json 创建具有多个键值的嵌套 Json 结构

    我的代码如下 import json def reformat importscompanies print importscompanies container child item dict for name imports in im
  • 具有不同签名的两个主要方法

    我有以下课程 public class Test public static void main Integer args System out println This is not a main public static void m
  • 用双反斜杠替换单反斜杠需要八个反斜杠吗?

    这是一个 这里到底发生了什么 的问题 我实际上不需要解决方案 我必须用双反斜杠替换 String 中的所有单反斜杠 这就是我最终所做的 strRootDirectory strRootDirectory replaceAll 其中 strR
  • 删除字符串开头和结尾的所有分隔符

    在折叠行并使用分号分隔后 我想删除字符串前面和后面的分号 多个分号代表单元格中的空白 例如 崩溃后的观察结果可能如下所示 TX PA CA 我希望单元格看起来像这样 TX PA CA 这是我的折叠代码 new df lt group by
  • Terraform 将 2 个变量合并为一个新变量

    我想在具有大量端口组的环境中自动部署 Vmware 虚拟机 为了能够选择正确的端口组 最好输入租户和环境这两个变量 这两个变量用于 CMDB 注册和部署目的 对于部署 需要将变量合并为 1 个新变量以选择正确的端口组 由于插值语法 似乎不可
  • 检测移动到 Mobile Safari 中的新选项卡

    我有一系列打开弹出窗口的页面 Mobile Safari 中的新选项卡 每个弹出窗口都需要知道它们何时获得焦点 在桌面上 我们使用window onblur and window onfocus来驱动这种行为 然而 这些事件在 iPad 上
  • 将枚举变体用作函数的奇怪语法是什么?

    下面是example由 mod 文档给出syn parse enum Item Struct ItemStruct Enum ItemEnum struct ItemStruct struct token Token struct iden
  • WinForm 应用程序中的安全连接字符串

    如何保护 WinForm 应用程序中的 ConnectionString 你不能 尽管您可以加密 app config 文件中的连接字符串 但应用程序需要能够对其进行解密 因此始终可以检索未加密的连接字符串 尤其是对于托管应用程序 可能不适
  • 如何在默认程序中打开文件 - Linux

    如何以编程方式在 Linux 中的默认程序中打开文件 我使用的是 Ubuntu 10 10 例如 打开 mp3 将在电影播放器 或其他东西 中打开该文件 你需要跑gnome open kde open 或 exo open 取决于您使用的桌
  • 为什么我无法在此 Spring Boot 应用程序中处理分段上传?我收到“找不到匹配的编辑器或转换策略”

    我正在研究一个春季启动应用程序 我发现尝试实现处理以下问题的控制器方法有些困难分段文件上传 为了做到这一点 我已经调整了这个春季MVC教程 http www codejava net coding upload files to datab
  • 使用 JSF h:outputLink 生成页面锚点

    简单的问题 如何创建 HTML 锚点 例如 a a with JSF e g
  • 非阻塞控制台输入?

    我正在尝试用 Python 制作一个简单的 IRC 客户端 作为我学习该语言时的一种项目 我有一个循环来接收和解析 IRC 服务器发送给我的内容 但是如果我使用raw input输入内容时 它会停止循环 直到我输入内容 显然 如何在不停止循
  • 工作表每行上不需要的符号

    我不知道我不小心点击的热键是什么 但是这个 每行代码上都出现了 look 标志 代码中没有空格 而是灰点 我怎样才能摆脱这些角色 假设这是 SQL Developer 请转到 工具 gt 首选项 或者在 Mac 上 在 SQL Develo
  • 如何在 Dart 中运行重复出现的函数?

    我想一遍又一遍地运行一个函数 中间有一个延迟 我怎样才能用 Dart 做到这一点 您可以使用Timer类来安排一次性和重复功能 重复 以下是运行重复函数的方法 import dart async main const oneSec Dura
  • Sveltekit + Typescript:环境变量构建错误

    我想在我的 Sveltekit 应用程序中使用环境变量 它在开发服务器上运行良好 但我收到此构建错误 Error PUBLIC KEY is not exported by env static public imported by src
  • 初始化谷歌地图时,mapFragment.getMapAsync(this)处出现空指针异常

    当我使用 Google Play Services v6 5 87 时 调用时出现空指针异常getMapAsync 我正在使用一个SupportMapFragment in my Fragment的 xml 布局 My code Suppo
  • Clojure 理解示例

    我在用docjure它的选择列功能需要一个列映射 我想获取所有列 而无需手动指定 如何生成以下惰性无限向量序列 A B C D E AA AB AC ZZ XFD 你的问题归结为 如何将数字转换为包含字母 A Z 的 26 进制字符串 这是
  • 使用OpenGL替代Canvas - Android

    我正在尝试用更快的 opengl es 表面替换我已经拥有的基于 Canvas 的渲染系统 但是 我似乎无法让 openGL 渲染器以充当 2d 场的方式符合 而不是透视图 我当前的渲染器代码如下所示 Override public voi
  • 是否可以复制某个控件的所有属性? (C# 窗口窗体)

    例如 我有一个DataGridView用蓝色控制BackgroundColor属性等 有没有一种方法可以以编程方式将这些属性转移或传递给另一个属性DataGridView控制 像这样的东西 dtGrid2 Property dtGrid1
  • \G 在 .split 中如何工作?

    我喜欢用 Java 进行代码高尔夫 尽管 Java 过于冗长而缺乏竞争力 即用尽可能少的字节完成某个挑战 在我的一个答案中 我有以下代码 for var p A4 B8 CU EM EW E3 G6 G9 I1 L7 NZ O0 R2 S5