2011-05-29 119 views
8

我遇到正则表达式以下令牌:[\s\S]*?[ s S] *之间的区别是什么?和。*?

如果我理解正确此,角色职业的意思是“匹配空格字符或一个非空白字符”。因此,这是否会与.*?

不一样:通常.与换行符不匹配。然而,这个正则表达式是用Ruby编写的,并通过了m modifier,这意味着.确实符合换行符。

是否有任何其他理由使用[\s\S]*?代替.*?

万一有帮助,正则表达式,我在看sprockets library内出现在HEADER_PATTERN不断上线97的充分体现是:

/ 
    \A \s* (
    (\/\* ([\s\S]*?) \*\/) | 
    (\#\#\# ([\s\S]*?) \#\#\#) | 
    (\/\/ ([^\n]*) \n?)+ | 
    (\# ([^\n]*) \n?)+ 
) 
/mx 
+0

我分享你的猜测。也许,如果您给我们整个regxp或使用它的上下文,它可能会有所帮助。 – sawa 2011-05-29 16:23:50

+0

@sawa这是一个好主意,谢谢。我编辑了我的问题。 – 2011-05-29 16:27:50

+0

感谢您添加正则表达式。现在,它看起来更奇怪了,因为它使用'm',并且正在使用'[^ ​​\ n]'来处理它。 – sawa 2011-05-29 16:41:07

回答

6

您正确解释了正则表达式。

这似乎是其他语言不支持m标志(或其他实现中的s标志)的遗留物。

使用该构造的一个原因是不使用m-flag,因此您可以使用它。没有匹配换行符,但仍然能够匹配所有需要的东西。

+0

这是一个伟大的想法和一个可能的用例 – 2011-05-29 16:22:50

+6

这可能是正确的答案。但是,红宝石有这样一个符号:'(?m:。)'。这会将'.'放在'm'模式下,而不会在'm'模式下生成整个正则表达式。谁使用原始的正则表达式并没有做好编码。 – sawa 2011-05-29 16:33:48

+0

@sawa我同意这两个陈述 – marsbear 2011-05-29 16:34:48

0

随着米旗,他们会是相同的,除了.*会更清晰,更容易维护。

0

换行符是唯一的区别。也许有人认为阅读起来比较容易,而不必知道上下文,或者希望它能够对上下文进行更改。

我看过[^]*用于类似目的。

相关问题