如何使用正则表达式在" 包含此行之前的所有文本"之前找到所有文本?
我在下面包含了一些示例文本
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)
然后从匹配结果中提取第一个子组.
(.*?)All text before this line will be included
Run Code Online (Sandbox Code Playgroud)
根据您正在使用的特定正则表达式框架,您可能需要包含一个标志,以指示.可以匹配换行符.
第一个(也是唯一的)子组将包含匹配的文本.如何提取它将再次取决于您正在使用的语言和正则表达式框架.
如果您想要包含 "此行之前的所有文字..."文字,那么整个匹配就是您想要的.