1

每当短语被分成多行时,我都无法匹配模式“无法运行此程序”,例如:

This program cannot be run

T
his program cannot be run

Thi
s program cannot be run

.
.

This pr
ogram cannot be run

图案可以在任意点分割成两条线。我尝试过使用 /m 和 /s 以及锚点和边界,但我无法让它工作。我对自己做错了什么感到茫然。我什至尝试在每个字符后使用 \s ,即使那样也不匹配!模式必须是 PCRE 格式。

4

3 回答 3

4

s并且m不会在这里帮助你。它们仅分别改变.和锚的行为。锚点和边界也无济于事,因为它们只会断言某物位于某个位置。

所有这些方法的问题在于,换行符会在字符串中引入一两个新字符(或\n,具体取决于您的系统)。因此,如果您需要仅正则表达式的解决方案,则必须在任何可能的点允许换行:\r\r\n

/T[\r\n]*h[\r\n]*i[\r\n]*s[\r\n]* [\r\n]*p[\r\n]*.../

等等。

如果您可以修改输入,则通过替换首先删除换行符会更容易

/[\r\n]+/

使用空字符串,然后运行您已有的模式。

于 2013-04-19T18:25:21.120 回答
2

如果换行符可以出现在所寻找的子字符串中的任何位置,则需要添加相应的字符以匹配正则表达式中的换行符。

假设换行符总是\n

T\n?h\n?i\n?s\n? \n?p\n?r\n?o\n?g\n?r\n?a\n?m\n? \n?c\n?a\n?n\n?n\n?o\n?t\n? \n?b\n?e\n? \n?r\n?u\n?n
于 2013-04-19T18:25:14.210 回答
0

所以它看起来很可怕,也许有人可以提供更好的解决方案,这里是在 python 中使用 re.S 标志

>>> a = """
... This pr
... ogram cannot be run"""
>>> re.search("T[\n]*h[\n]*i[\n]*s[\n]* [\n]*p[\n]*r[\n]*o[\n]*",a,re.S)
<_sre.SRE_Match object at 0x7f9d746e9e68>

如果您的字符串发生变化,制作正则表达式的简单方法

>>> a = "This program cannot be run"
>>> b = list(a)
>>> r = '[\r\n]*'.join(b)
于 2013-04-19T18:25:51.690 回答