将字符串与 perl 中的模式对齐?

2024-06-21

我在方括号内有一些字符串块,如下所示:

[p1 text1/label1] [p2 text2/label2] [p3 text3/label3] [...

等等。

每个块里面有什么并不重要。但有时会有一些没有用方括号括起来的零散文本块。例如:

[p1 text1/label1] [p2 text2/label2] textX/labelX  [p3 text3/label3] [...] textY/labelY textZ/labelZ [...]

我以为我已经用 Perl 中的正则表达式很好地解决了这个问题,直到我意识到我只满足了文本开头、中间或结尾处有单个杂散文本的情况,但不适用于我们可能有两个杂散文本的情况流浪病例聚集在一起。 (如上面的 Y 和 Z 块)。

所以我意识到perl中的正则表达式只能捕获第一个匹配模式?那么上述问题如何解决呢?

Edit:

问题是要确保所有应该用括号包围。方括号永远不会递归。当用方括号括起短语时,p 值取决于“标签”值。例如,如果一个不带括号的杂散短语是

li/IN

那么它应该变成:

[PP li/IN]

我想这是一个混合体,但我能想到解决我正在解决的更大问题的唯一方法是将它们全部变成括号内的短语,这样处理起来更容易。因此,如果一个不带括号的短语出现在开头、中间和结尾,我就可以正常工作,但如果两个或更多短语同时出现,我就可以正常工作。

我基本上对每个位置(开始、中间和结束)使用了不同的正则表达式。中间有一个不带括号的短语的看起来像这样:

$data =~ s/\] (text)#\/label \[/\] \[selected-p-value $1#\/label\] \[/g;

所以我所做的只是注意到,如果 ] 出现在文本/标签模式之前和之后,那么这个没有括号。我也为其他人做类似的事情。但我想这是非常不通用的。我的正则表达式不太好!


#!/usr/bin/perl

use strict;
use warnings;

my $string = "[p1 text1/label1] [p2 text2/label2] textX/labelX  [p3 text3/label3] [...] textY/labelY textZ/labelZ [...]";

# don't split inside the [], i.e. not at blanks that have p\d in front of them
my @items = split(/(?<!p\d)\s+/, $string);
my @new_items;

# modify the items that are not inside []
@new_items = map { ($_ =~ m/\[/) ? $_ :
                    ((split("/",$_))[1] eq ("IN")) ? "[PP $_]" :
                    "[BLA $_]";
                 } @items;

print join(' ', @new_items), "\n";

这给出了

[p1 text1/label1] [p2 text2/label2] [PP textX/labelX] [p3 text3/label3] [...] [PP textY/labelY] [PP textZ/labelZ] [...]

我认为PP是我在这里使用的意思,否则map必须变得更加复杂一些。

EDIT

我已编辑代码以响应您的评论。如果你使用

"[p1 text1/label1] [p2 text2/label2] textX/IN  [p3 text3/label3] [...] textY/labelY textZ/labelZ [...]";

作为示例字符串,这是输出:

[p1 text1/label1] [p2 text2/label2] [PP textX/IN] [p3 text3/label3] [...] [BLA textY/labelY] [BLA textZ/labelZ] [...]

只需记住一件事:使用的正则表达式split不会为pnn > 9。如果遇到这种情况,最好寻找替代方案,因为可变长度后向查找尚未实现(或者至少在我的 Perl 版本(5.10.1)中还没有实现)。

EDIT 2

作为对您的第二条评论的回复,这是脚本的修改版本。您会发现我还在示例字符串中添加了一些内容,以证明它现在可以工作,即使没有pn在 - 的里面[...].

#!/usr/bin/perl

use strict;
use warnings;

my $string = "[p1 text1/label1] [p2 text2/label2] textX/IN  [p3 text3/label3] [...] textY/labelY textZ/labelZ [...] xyx/IN [opq rs/abc]";

# we're using a non-greedy match to only capture the contents of one set of [], 
# otherwise we'd simply match everything between the first [ and the last ].
# The parentheses around the match ensure that our delimiter is KEPT.
my @items = split(/(\[.+?\])/, $string);

#print "..$_--\n" for @items;  # uncomment this to see what the split result looks like

# modify the items that are not inside []
my @new_items = map {
                     if (/^\[/) { # items in []
                        $_;
                     }
                     elsif (/(?: \w)|(?:\w )/) { # an arbitrary number of items without []
                       my @new =  map { ($_ =~ m/\[/) ? $_ :
                                        ((split("/",$_))[1] eq ("IN")) ? "[PP $_]" :
                                        "[BLA $_]";
                                      } split;
                     }
                     else { # some items are '', let's just discard those
                     }
                    } @items;

print join(' ', @new_items), "\n";

输出是这样的:

[p1 text1/label1] [p2 text2/label2] [PP textX/IN] [p3 text3/label3] [...] [BLA textY/labelY] [BLA textZ/labelZ] [...] [PP xyx/IN] [opq rs/abc]

我注意到您已经收到了所需的帮助,但我想我仍然可以回答您的问题......

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

将字符串与 perl 中的模式对齐? 的相关文章

  • 在 python 中使用正则表达式返回唯一匹配

    生成正则表达式的所有唯一匹配项的最有效 或最 Pythonic 方法是什么 现在我刚刚申请set 使用后findall 但我不确定是否有更好的方法 查找所有匹配项的其他方法 使用其他方式通过正则表达式在文本中搜索 您可以与一路上获得的匹配项
  • java中的“字符串...”是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 可变参数和 参数 https stackoverflow com questions 1656901 varargs and the argument Java 参数中3个点 https stacko
  • 在字符串列表中查找子字符串

    我有一个像这样的列表 我希望能够在此列表中搜索来自另一个字符串的子字符串 例子 List
  • 为什么 Javascript 不支持lookbehind断言?

    最近我意识到 因有些尴尬 正则表达式lookbehind assertions were not可能在Javascript 这种看似常见的断言不存在的 事实 原因是什么 我意识到也许有其他方法可以实现同样的目标 https stackove
  • 在android上使用正则表达式验证字符串

    我希望我的字符串不包含 and 我用这个代码 private static boolean IsMatch String s String pattern try Pattern patt Pattern compile pattern M
  • 如何在 Perl 中生成数组的所有排列?

    生成所有内容的最佳 优雅 简单 高效 方式是什么 n perl 中数组的排列 例如 如果我有一个数组 arr 0 1 2 我想输出所有排列 0 1 2 0 2 1 1 0 2 1 2 0 2 0 1 2 1 0 它可能应该是一个返回迭代器的
  • 使用正则表达式检查字符串是否以数字字符开头和结尾

    我想 String string 123456 if string startsWith 0 9 string endsWith 0 9 code And the if子句永远不会被调用 不要使用正则表达式 Character isDigi
  • 在 Python 中将 int 转换为字符串

    我希望能够生成多个名为 fileX txt 的文本文件 其中 X 是某个整数 for i in range key filename ME i txt Error here Can t concat a string and int fil
  • php洗一副牌

    我想使用 php 创建随机桥手的集合 我认为我可以将有序的卡片包编码为字符串 deal下面 我喜欢它有 52 个字母 同时考虑大小写 我发现了 php 函数str shuffle 所以我想我可以做以下事情 pack abcdefghijkl
  • 如何在二维数组中找到字符串?

    我有一个看起来像这样的数组 var array a b c d e f 我希望能够在数组中搜索字符串 d 并返回对应的值 c try function find str array for var i in array if array i
  • 如何在 标签中用 %20 替换空格

    我想替换 html 文本的图像标签中的所有空格 Example img src to img src photo 201 jpg 我没有找到 preg replace 的解决方案 但它可能是一个简单的正则表达式行 谢谢 Edit 抱歉各位
  • Mac 上使用 Excel VBA 进行正则表达式

    我需要将 regEx 与 Excel VBA 一起使用 我使用的是 Mac OS 10 10 和 Office 2011 因此没有可以使用的 DLL 文件 这里有什么可做的 我读到我必须绑定一个苹果脚本 这是如何完成的以及该脚本需要什么内容
  • 我需要一个字数统计程序[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要弄清
  • 如何在 Perl 中将数组数据插入 MySQL?

    我用下面的脚本解析一个文本文件 如何将数组数据插入到MySQL表中 我已经学习了 Perl MySQL DBI 连接方法 我可以成功连接到本地 MySQL 数据库 我可以使用 MySQL 命令行创建表 C Perl bin perl exe
  • 如何仅替换多个文件中记事本++中的第一个文本实例?

    我正在努力更新一个网站并进行一些更改 并且我已经成功使用标准查找和替换搜索对多个文件进行了大部分更改 我的 f r 中只留下一个错误需要修复 但它在整个文档中出现了几次 我只想替换第一个实例 这是唯一一次错误 div class boxb
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Java 不可变对象 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在学习不变性的概念 据我了解 一旦创建对象 不可变对象就无法更改其值 但我不明白不可变对象的以下用途 They are 自动是线程
  • 使正则表达式以惰性方式匹配,同时跳过一些单词

    我想要正则表达式 其中包括跳过一些单词以惰性方式匹配 例如 正则表达式 all s S 0 10 s Damages amount s S 0 10 s in s excess s of 示例文本 第 8 1 a 条规定的所有此类损害超出免
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 使用正则表达式匹配阿拉伯文文本

    我试图使用正则表达式仅匹配阿拉伯语文本 但出现异常 这是我的代码 txt matches P Arabic 这是例外情况 线程 main 中的异常 java util regex PatternSyntaxException 索引 9 附近

随机推荐

  • PhoneGap 是应用程序开发的好选择吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 什么是 .NET 程序集?

    什么是 NET 程序集 我浏览了网络 但无法理解其定义 程序集是 net 应用程序的最小部署单元 它可以是一个dll or an exe 它主要有两种类型 私人集会 dll 或 exe 是一个应用程序的专有财产 一般存放在应用程序根文件夹中
  • 以十六进制打印字符串? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这种以十六进制打印字符串的简短方法是
  • RobolectricGradleTestRunner 与 RobolectricTestRunner.class

    在 roboelectric 中 当您编写测试类时 您已经声明了 RunWith 注释 其中有 RobolectricGradleTestRunner 和 RobolectricTestRunner class 有什么区别以及我们应该使用哪
  • 本地化:django-admin compilemessages 跳过 venv

    我正在使用本地化Django 1 11应用 我可以排除虚拟环境文件夹node modules文件夹 同时使用消息文件添加消息 i选项如 django admin makemessages l no i venv django admin m
  • Rails 4:带有 has_many 的复选框

    我正在构建一个必须将任务分配给多个雇主的应用程序 我已经构建了这些模型 assignment rb class Assignment lt ActiveRecord Base has many employer assignments ha
  • Windows Phone 8 中的 Webview 弹跳

    我需要知道是否有任何方法可以控制 Windows 8 中的 webview 弹跳属性 我已经尝试过 ms touch action none 它确实会停止弹跳 但会禁用应用程序中的整个滚动 我已尝试以下方法 但这些方法不起作用 backfa
  • Firestore分页-如何查找查询后是否有更多数据(使用限制)

    我们在当前的 python 2 7 标准环境中使用 ndb 数据存储 我们使用 firestore 本机模式 将此应用程序迁移到 python 3 7 标准环境 我们在 ndb 数据存储上使用分页并使用 fetch 构建查询 query r
  • Android,语言文件不起作用

    我现在正在创建一个 Android 应用程序 并尝试为我的母语添加语言文件 但在某种程度上 这对我不起作用 我尝试在两部不同的手机中加载该应用程序 但结果相同 之前创建过语言文件 效果良好 但这次不行 手机设置为瑞典语 语言文件适用于我创建
  • 如何从 JavaScript 中计算 HTML 表格的渲染高度?

    调整窗口大小时 我需要知道表格有多大 以便我可以动态地很好地适应中间的所有其他内容 表格高度仅取决于动态加载的内容 如何在 JavaScript 中计算表格的渲染高度 您可以使用element offsetHeight https deve
  • NSWorkspaceWillPowerOffNotification 从未被调用

    我正在尝试在后台进程中运行一个程序 该程序将注册系统中的每个关闭事件 通过注册 NSWorkspaceWillPowerOffNotification 来实现此目的 如下所示 import
  • 如何在同一台机器上运行 2 个(或更多)Wildfly 实例?

    我想通过运行 2 个独立的 Wildfly 实例来模拟 2 个服务器 当您不想在同一个实例上部署所有 WAR 然后只能将它们关闭并一起启动时 这非常有用 我正在将 Eclipse 与 JBoss 插件一起使用 在服务器视图中 我希望有 2
  • Javascript 与 Python 关于 Python 'map()' 函数的比较

    Python中有一个函数叫做map这可以让你去 map someFunction x y z 并继续应用该功能的列表 是否有与此功能等效的 JavaScript 我现在刚刚学习Python 虽然我被告知javascript是函数式语言 但我
  • Python 应用程序的最佳项目结构是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 想象一下 您想要用 Python 开发一个重要的最终用户桌面 不是 Web 应用程序 构建项目文件夹层次结构的最佳方法是什么 理想的特
  • Eclipse 依赖项目未复制到 WTP 部署

    在我们开始使用 Gradle 之前 Eclipse 中的多项目 10 12 开发工作已通过 WTP 项目成功部署到内部 Tomcat 7 服务器之一 我们发现这对于开发非常有用 Gradle 启动并运行后 依赖项目的 jar 文件不再被复制
  • 如何在asp mvc的视图中加载选定的partialview?

    我正在从事 ASP NET Mvc 项目 我有一个类似于图像的视图 在此输入图像描述 https i stack imgur com xI6Fa jpg 我在布局中设计了右侧面板 我的布局代码 div class col md 3 pane
  • 将寻呼机视为列表视图行项目

    我有一个包含 20 行的列表视图 我想为列表视图中的每一行设置一个视图寻呼机 由于列表视图的行中的项目可能是一个或多个 并且我想使用视图分页器显示列表视图行项目 为此 我使用以下代码 将显示在列表视图行中的自定义布局 作为分页器项目
  • Moxy、JSON 和 Jersey 2.0 不会反序列化纯字符串数组

    在我当前的设置中 我使用 Jersey 2 0 和 MOXy 如中所述球衣文档 https jersey java net documentation latest media html json moxy 我完全依赖于 自动发现的功能 所
  • gcc - 如何从静态库输出 (.a) 中删除所有绝对路径

    我正在使用 GCC for ARM 红色套件 4 恩智浦 http www code red tech com red suite 4 nxp php 我正在编译用于最终应用程序的静态库文件 a 我需要配置项目 以便任何开发人员都可以生成完
  • 将字符串与 perl 中的模式对齐?

    我在方括号内有一些字符串块 如下所示 p1 text1 label1 p2 text2 label2 p3 text3 label3 等等 每个块里面有什么并不重要 但有时会有一些没有用方括号括起来的零散文本块 例如 p1 text1 la