在使用正则表达式之前查找所有文本

jef*_*eff 6 regex

如何使用正则表达式在" 包含此行之前的所有文本"之前找到所有文本?

我在下面包含了一些示例文本

This can include deleting, updating, or adding records to your database, which would then be reflex.

All text before this line will be included

You can make this a bit more sophisticated by encrypting the random number and then verifying that it is still a number when it is decrypted. Alternatively, you can pass a value and a key instead.
Run Code Online (Sandbox Code Playgroud)

Pet*_*ton 12

从解释开始...跳到结束以获得快速答案

要匹配特定的文本,并确认它在那里但不包括匹配,您可以使用正面的前瞻,使用表示法 (?=regex)

这确认了'正则表达式'存在于该位置,但仅匹配起始位置,而不是它的内容.

所以,这给了我们表达式:

.*?(?=All text before this line will be included)
Run Code Online (Sandbox Code Playgroud)

.任何角色在哪里,并且*?是懒惰的匹配(与可能消耗尽可能多的常规*消耗相比,可能消耗的量最少).

但是,几乎所有正则表达式.都会排除换行符,因此我们需要明确使用标志来包含换行符.要使用的标志是s(代表"单行模式",尽管在某些风格中它也被称为"DOTALL"模式).

这可以通过各种方式实施,包括......

在全球范围内,基于/的正则表达式:

/regex/s
Run Code Online (Sandbox Code Playgroud)

内联,正则表达式的全局:

(?s)regex
Run Code Online (Sandbox Code Playgroud)

内联,仅适用于括号部分:

(?s:reg)ex
Run Code Online (Sandbox Code Playgroud)

并且作为一个函数参数(取决于你正在使用正则表达式的语言).

所以,你想要的正则表达式可能是这样的:

(?s).*?(?=All text before this line will be included)
Run Code Online (Sandbox Code Playgroud)


但是,有一些警告:

首先,并非所有的正则表达式都支持延迟量词 - 您可能必须使用.*,(或者如果"之前的所有文本..."可以出现多次,则可能使用更复杂的逻辑,具体取决于精确的要求).

其次,并非所有正则表达式都支持前瞻,因此您需要使用捕获的组来获取要匹配的文本.

最后,您不能总是指定标志,例如s上面的标志,因此可能需要匹配"任何内容或换行符" (.|\n)或者可能[\s\S](空格而不是空格)以获得等效匹配.

如果您受到所有这些限制(我认为XML实现是),那么您将不得不这样做:

([\s\S]*)All text before this line will be included
Run Code Online (Sandbox Code Playgroud)

然后从匹配结果中提取第一个子组.


Vot*_*ple 9

(.*?)All text before this line will be included
Run Code Online (Sandbox Code Playgroud)

根据您正在使用的特定正则表达式框架,您可能需要包含一个标志,以指示.可以匹配换行符.

第一个(也是唯一的)子组将包含匹配的文本.如何提取它将再次取决于您正在使用的语言和正则表达式框架.

如果您想要包含 "此行之前的所有文字..."文字,那么整个匹配就是您想要的.