当前位置: 首页 > 知识库问答 >
问题:

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

濮阳唯
2023-03-14

但我对修饰语s和m感到困惑。谁能用代码示例来解释s和m之间的区别,说明它是如何不同的?我试着在网上搜索,它只在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"

共有1个答案

钮边浩
2023-03-14

你链接到自己的文档在我看来很清楚。如果您解释一下在理解它时遇到了什么问题,以及您是如何认为/s/m是对立的,这将会有所帮助。

简而言之,/s更改了点元字符.的行为,使其与任何字符匹配。通常情况下,它匹配除换行符“\n”以外的任何内容,因此即使字符串包含换行符,它也将字符串视为单行。

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

您不应该将/g修饰符混淆为“greedy”。它用于全局匹配,它将查找字符串中模式的所有匹配项。贪婪一词通常用于表示模式中量词的行为。例如,.*被认为是贪婪的,因为它将匹配尽可能多的字符,而.*?将匹配尽可能少的字符。

更新

在修改后的问题中,您使用了/“.*”/mg,其中/m不相关,因为如上所述,该修饰符只改变$^元字符的行为,而您的模式中没有任何元字符。

将其更改为/“.*”/sg会稍微改进一些,因为.现在可以匹配每行结尾的换行符,因此模式可以匹配多行字符串。(请注意,这里将对象字符串视为“单行”--即,就.而言,匹配的行为就好像其中没有换行符。)这里是greedy的常规含义,因为模式现在匹配从第一行中的第一个双引号到最后一行末尾的最后一个双引号的所有内容。我想那不是你想要的。

有几种方法可以解决这个问题。我建议更改您的模式,使您想要的字符串是一个双引号,后跟除双引号之外的任何字符序列,后跟另一个双引号。这是写/“[^”]*“/g(注意,/s修饰符不再是必需的,因为模式中现在没有点),并且几乎可以满足您的需要,只是转义的双引号被视为模式的结尾。

请看一下这个程序及其输出,注意我在每个匹配的开始处都放了一个人字形>>,以便区分它们

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"

输出

>> "This is string"

>> "1!=2"

>> "This is \"

>> ""

>> "string1"

>> "string2"

>> "String"

>> "S
t
r
i
n
g"

正如您所看到的,除了在“this is\”string\“”中找到了两个匹配项,“this is\”“”之外,现在一切都井然有序。修复它可能比你想要的更复杂,但这是完全可能的。如果你也需要修理,请告诉我。

更新

>> "This is string"

>> "1!=2"

>> "This is \"string\""

>> "string1"

>> "string2"

>> "String"

>> "S
t
r
i
n
g"
 类似资料:
  • 主要内容:实例,实例,实例,实例标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。 标记不写在正则表达式里,标记位于表达式之外,格式如下: 下表列出了正则表达式常用的修饰符: 修饰符 含义 描述 i ignore - 不区分大小写 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。 g global - 全局匹配 查找所有的匹配项。 m multi line - 多行匹配 使边界字符 ^ 和 $ 匹配

  • 问题内容: 我正在使用orient-db数据库,但是正则表达式模式匹配存在问题。我确实需要在请求中包含不区分大小写的修饰符,但是它不按预期工作。 询问: 以小写形式返回预期的匹配项。 每当我尝试添加修饰符时,即在分隔符之外 我得到一个空的收藏。实际上,只要存在分隔符,查询就会返回一个空集合。 如果没有办法附加修饰符,我可能可以将每个“ alpha”字符替换为方括号中的表达式,即 但是我对这种解决方

  • 本文向大家介绍JS正则表达式修饰符中multiline(/m)用法分析,包括了JS正则表达式修饰符中multiline(/m)用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了JS正则表达式修饰符中multiline(/m)用法。分享给大家供大家参考,具体如下: JavaScript正则表达式有3种修饰符/i、/m和/g。/i是我们最常用,也是最好理解的,代表正则表达式匹配的时候不区

  • 本文向大家介绍浅谈PHP正则表达式中修饰符/i, /is, /s, /isU,包括了浅谈PHP正则表达式中修饰符/i, /is, /s, /isU的使用技巧和注意事项,需要的朋友参考一下 在学习PHP正则表达式修饰符之前先来理解下贪婪模式,前面在元字符中提到过"?"还有一个重要的作用,即"贪婪模式",什么是"贪婪模式"呢? PHP正则表达式贪婪模式: 比如我们要匹配以字母"a"开头字母"b"结尾的

  • 主要内容:匹配操作符,实例,正则表达式变量,实例,替换操作符,实例,转化操作符,实例,更多正则表达式规则正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式。 Perl的正则表达式的三种形式,分别是匹配,替换和转化: 匹配:m/ /(还可以简写为/ /,略去

  • 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式。 Perl的正则表达式的三种形式,分别是匹配,替换和转化: 匹配:m//(还可以简写为//,略去m) 替