了解 Perl 正则表达式修饰符 /m 和 /s [重复]

2024-03-03

我一直在阅读带有修饰符 s m 和 g 的 perl 正则表达式。我知道 //g 是全局匹配,它将是贪婪搜索。

但我对修饰符 s 和 m 感到困惑。谁能用代码示例解释 s 和 m 之间的区别,以展示它们有何不同?我尝试在线搜索,它只给出链接中的解释http://perldoc.perl.org/perlre.html#Modifiers http://perldoc.perl.org/perlre.html#Modifiers。在 stackoverflow 中我什至看到人们一起使用 s 和 m。 s不是与m相反吗?

//s 
//m 
//g

我无法使用 m 来匹配多行。

use warnings;
use strict;
use 5.012;

my $file; 
{ 
 local $/ = undef; 
 $file = <DATA>; 
};
my @strings = $file =~ /".*"/mg; #returns all except the last string across multiple lines
#/"String"/mg; tried with this as well and returns nothing except String
say for @strings;

__DATA__
"This is string"
"1!=2"
"This is \"string\""
"string1"."string2"
"String"
"S
t
r
i
n
g"

The 文档 http://perldoc.perl.org/perlre.html#Modifiers我认为你与自己的联系非常清楚。如果您能解释一下您在理解它时遇到的问题以及您如何认为这一点,将会有所帮助/s and /m是对立的。

非常简短地,/s更改点元字符的行为.这样它就可以匹配任何字符。通常它匹配除换行符之外的任何内容"\n",因此将字符串视为s单行,即使它包含换行符。

/m修改插入符号^和美元$元字符,以便它们在换行符处匹配within字符串,将其视为m多行字符串。通常它们只会在字符串的开头和结尾匹配。

你不应该与/g修饰语是“贪婪”。那是为了g全局匹配将找到all字符串中模式的出现次数。期限greedy通常是量词行为的用户within模式。例如.*之所以说是贪婪的,是因为它会匹配尽可能多的字符,而不是.*?这将匹配为few尽可能的字符。


Update

在您修改后的问题中,您正在使用/".*"/mg,其中/m是无关紧要的,因为如上所述,该修饰符仅改变$ and ^元字符,而您的模式中没有元字符。

将其更改为/".*"/sg改进了一些事情.现在可以匹配每行末尾的换行符,因此该模式可以匹配多行字符串。 (注意,这是object被认为是的字符串“单线”这里 - 即匹配的行为就好像其中没有换行符一样.)然而这里是传统的含义greedy,因为该模式现在匹配从第一行中的第一个双引号到最后一行末尾的最后一个双引号的所有内容。我想这不是你想要的。

有几种方法可以解决这个问题。我建议更改您的模式,以便您想要的字符串是双引号,后跟任意字符序列除了双引号,后跟另一个双引号。这是写的/"[^"]*"/g(请注意,/s修饰符不再是必要的,因为现在模式中没有点)并且几乎完成了您想要的操作,只是转义的双引号被视为结束模式。

看一下这个程序及其输出,请注意我已经放置了一个 V 形符号>>在每场比赛开始时以便区分

use strict;
use warnings;

my $file = do {
  local $/;
  <DATA>; 
};

my @strings = $file =~ /"[^"]*"/g;

print ">> $_\n\n", for @strings;

__DATA__
"This is string"
"1!=2"
"This is \"string\""
"string1"."string2"
"String"
"S
t
r
i
n
g"

output

>> "This is string"

>> "1!=2"

>> "This is \"

>> ""

>> "string1"

>> "string2"

>> "String"

>> "S
t
r
i
n
g"

正如你所看到的,现在一切都井然有序,除了"This is \"string\""它找到了两个匹配项,"This is \", and ""。解决这个问题可能比您想要的更复杂,但这是完全可能的。如果您也需要修复,请这么说。


Update

我不妨结束这件事。要忽略转义双引号并将它们视为字符串的一部分,我们需要接受either \" or除双引号之外的任何字符。这是使用正则表达式交替运算符完成的|并且必须分组在非捕获括号内(?: ... )。最终结果是/"(?:\\"|[^"])*"/g(反斜杠本身必须被转义,因此它会加倍),当放入上面的程序时,会产生这个输出,我认为这就是你想要的。

>> "This is string"

>> "1!=2"

>> "This is \"string\""

>> "string1"

>> "string2"

>> "String"

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

了解 Perl 正则表达式修饰符 /m 和 /s [重复] 的相关文章

随机推荐

  • android:如何在字符串中添加下划线

  • 按组计算值之间的差异并匹配时间

    对于每只鸟 我想计算不同日期的平均每小时体温 Tb 测量值 Tb Periods 之间的差异 我的目标是能够比较 BirdX 从 0900 PreI 到 09 00 DayI 10 00 PreI 到 10 00 PostI 等的 Tb 变
  • 如何在 POST 期间获取不同资源的 JAX-RS @Path?

    我有两个用于涉及用户资源的简单 Web 服务 Jersey 和 GlassFish 的 REST 类 一个对所有用户进行操作 例如 POSTing 的工厂 另一个对单个用户进行操作 例如 GET PUT 删除 他们位于 Stateless
  • 在sql server中使用case语句更新多列

    我想使用 case 语句更新表 查询是这样的 select case columnname when name1 then begin update table set pay1 pay1 100 pay2 pay2 20 pay3 pa
  • .Net Core 无法使用位图

    我正在使用 Net Core 2 1 开发 Web 服务 我有一个字节数组 其中包含所有像素值 灰度 宽度 高度 我想从这些参数创建一个位图 这是我的代码 来自一个正在运行的 Net Framework 4 项目 public FileRe
  • CollapsingToolbarLayout 未正确调用 requestLayout()

    我有一个折叠的工具栏布局 其中包含图像 折叠时显示工具栏标题 我需要更改工具栏标题字体 因此我在工具栏布局中添加了一个文本视图 现在 每当我折叠工具栏时 都会重复生成以下错误 08 12 13 14 19 604 2263 2263 com
  • 什么时候应该从类方法返回对对象的引用

    从类方法返回引用的最佳实践是什么 是否希望在没有引用的情况下返回基本类型 而希望通过引用返回类对象 您推荐的任何文章 最佳实践文章 我假设你所说的类方法是指成员函数 通过引用返回 的意思是 返回对成员数据的引用 这主要与返回对 local
  • Coq 中的“错误:宇宙不一致”是什么意思?

    我正在努力通过软件基础 http www cis upenn edu bcpierce sf current 目前正在做教堂数字的练习 这是自然数的类型签名 Definition nat forall X Type X gt X gt X
  • Google Finance,如何获取 JSON 数据流?

    我之前试图解释这一点 但显然失败了 因此 如果您打开了谷歌金融图表 例如 http www google com finance q INDEXNASDAQ IXIC http www google com finance q INDEXN
  • 将 HTTP 响应正文解析为 XML

    我使用此代码执行 HTTP 请求并解析 XML 响应 using HttpWebResponse resp req GetResponse as HttpWebResponse if resp StatusCode HttpStatusCo
  • R中基于移动时间窗口连接数据

    我有每小时记录一次的天气数据 以及每 4 小时记录一次的位置数据 X Y 我想知道 X Y 位置的温度是多少 天气数据并不完全相同 因此 我为每个位置编写了这个循环 以扫描天气数据 查找日期 时间中的 最接近 并提取该时间的数据 问题是我编
  • prolog 如何使用 succ 运行递归查询?

    有人可以向我解释一下为什么这个序言查询会这样工作吗 定义是 add 0 Y Y add succ X Y succ Z add X Y Z 鉴于这种 add succ succ succ 0 succ succ 0 R 这是查询的轨迹 Ca
  • 如何根据数据属性内对象的属性选择元素?

    如果我的标记如下所示 div div div div div div 如果我只有键 bar 或 foo 我将如何使用 JQuery 选择特定元素 我可以取出每一行的整个对象并迭代它以查找匹配项 但如果有更有
  • Pdfplumber 无法识别表 python [重复]

    这个问题在这里已经有答案了 我使用 Pdfplumber 提取第 2 页第 3 部分的表格 通常 但它只适用于某些 pdf 其他则不起作用 对于失败的 pdf 文件 似乎 Pdfplumber 读取的是按钮表而不是我想要的表 我怎样才能拿到
  • Windows 如何更改或插入物理扇区到另一个文件中?

    我有 20 个文件 其中数据结构在 NTFS 中与 4k 扇区对齐 我想合并所有文件无需复制任何数据 目标是编写一种通过直接更改 NTFS 虚拟集群和物理集群来工作的插入 API 目标是从 50GB 块中获得大小为 1TB 的文件 而无需复
  • 将值传递给 Sql 中的空值列

    我有一个Sections表 在该表中我有列SectionId CourseId Name Capacity 这里CourseId是一个空值列 它的外键在这里聚焦于Course表 这个CourseId列是一个新添加了一个 我正在尝试向此表添加
  • 关闭 SVG 标签,显式关闭还是自动关闭?

    我正在验证我的代码 并收到以下错误Tag cannot be self closing Use an explicit closing tag 在 IE 中作为我的 svg 路径 因为它是自动关闭的
  • 时髦的 haskell 惰性列表隐式递归

    在 Haskell 中 由于懒惰 您可以构建无限列表 Prelude gt let g 4 g Prelude gt g 0 4 Prelude gt take 10 g 4 4 4 4 4 4 4 4 4 4 现在 当我尝试构建这样的列表
  • python 中的无循环 3D 矩阵乘法

    我希望在 python numpy 中执行以下操作 Matrix A is M x N x R Matrix B is N x 1 x R 矩阵乘法 AB C 其中 C 是 M x 1 x R 矩阵 本质上 A 的每个 M x N 层 其中
  • 了解 Perl 正则表达式修饰符 /m 和 /s [重复]

    这个问题在这里已经有答案了 我一直在阅读带有修饰符 s m 和 g 的 perl 正则表达式 我知道 g 是全局匹配 它将是贪婪搜索 但我对修饰符 s 和 m 感到困惑 谁能用代码示例解释 s 和 m 之间的区别 以展示它们有何不同 我尝试