正则表达式中的(?ms)是什么意思?

Pow*_*hel 13 regex powershell

我在Powershell中关注了Regex:

[regex]$regex = 
@'
(?ms).*?<DIV class=row>.*?
'@
Run Code Online (Sandbox Code Playgroud)

(?ms)在这里是什么意思.

Tut*_*man 17

(?m)是多行模式的修饰符.它使^$匹配,而不是输入的开始和结束相匹配的线,分别的开始和结束.

例如,给定输入:

ABC DEF
GHI

正则表达式^[A-Z]{3}将匹配:

  1. "ABC"

同时,正则表达式(?m)^[A-Z]{3}将匹配:

  1. "ABC"
  2. "GHI"

(?s)是单行模式的修饰符.它会将换行符和换行符添加到.匹配的字符列表中.

给定与之前相同的输入,正则表达式[A-Z]{3}.将匹配(注意包含空格字符):

  1. "ABC "

虽然正则表达式(?s)[A-Z]{3}.将匹配:

  1. "ABC "
  2. "DEF\n"

尽管他们的名字,这两种模式不一定是相互排斥的.在一些实施方式中,它们取消,但是,在大多数情况下,它们可以一起使用.您可以通过书写(?m)(?s)或以较短的形式同时使用两者(?ms).

编辑:

在某些情况下您可能想要使用(?ms).以下示例有点人为,但我认为它们符合我们的目的.给定输入(注意"ABC"之后的空格):

ABC
DEF
GHI

正则表达式(?ms)^[A-Z]{3}.匹配:

  1. "ABC "
  2. "DEF\n"

虽然两者(?m)^[A-Z]{3}.(?s)^[A-Z]{3}.匹配:

  1. "ABC "


小智 6

有时人们说(?s)是单线模式.它没有,没有这样的事情.
这意味着Dot meta-char .匹配任何换行符,这意味着Dot匹配任何字符.
默认的通常是点确实匹配换行符,所以你必须明确
通过正则表达式选项不变,或在线修改设定点,所有修改(?s).

(?m)是多行修饰符.它允许锚点^$匹配行的开头/结尾,
以及字符串的开头/结尾.

如何/何时/应该 (?ms)一起使用?
答案是,有时你想使用Dot来跨越换行符,同时
需要^在行首开始匹配.你不确定中间的任何事情.

例:

(?ms)^BlockStart.*?BlockEnd

输入的位置是:

StringStart aasdfasdffasdf
asgasgasgw fasfggasfgaag
BlockStart asgdfasggafsdgadsfg aaaasfgaafdsgasfg afbaadsf afdsgadsfg BlockEndafsbgafsdgasfg
aaaaaafrgasfgaadsfgg