正则表达式匹配两个字符串之间的所有字符

Posted

技术标签:

【中文标题】正则表达式匹配两个字符串之间的所有字符【英文标题】:Regex Match all characters between two strings 【发布时间】:2011-08-31 21:06:46 【问题描述】:

示例: “这只是\n个简单的句子”。

我想匹配“This is”和“sentence”之间的每个字符。应该忽略换行符。我不知道正确的语法。

【问题讨论】:

您可能想指出您在什么环境中使用正则表达式。根据您所说的“忽略”换行符的确切含义,可能会有所不同。 【参考方案1】:

例如

(?<=This is)(.*)(?=sentence)

Regexr

我使用了lookbehind (?&lt;=)和lookbehind (?=),这样“This is”和“sentence”不包括在匹配中,但这取决于你的用例,你也可以简单地写This is(.*)sentence

这里重要的是您激活正则表达式引擎的“dotall”模式,以便. 匹配换行符。但是如何做到这一点取决于您的正则表达式引擎。

接下来是如果您使用.*.*?。第一个是贪婪的,会匹配到字符串中的最后一个“句子”,第二个是惰性的,会匹配到字符串中的下一个“句子”。

更新

Regexr

This is(?s)(.*)sentence

(?s) 在哪里打开 dotall 修饰符,使 . 匹配换行符。

更新 2:

(?<=is \()(.*?)(?=\s*\))

与您的示例“这是(一个简单的)句子”相匹配。请参阅此处Regexr

【讨论】:

@tchrist,对不起,我不得不查一下。我是否理解正确并且This is(?s)(.*)sentence 会起作用? @stema:是的,这应该可以在大多数正则表达式库下启用“全点”模式。 这主要解决了我的问题,但是如何在我的模式中包含空格字符?我尝试了以下方法:"(.*?)( ))" 以匹配序列末尾的 ")",但它不起作用。 只有一个注释 - 正则表达式现在说 javascript 不支持后视 有没有办法处理文本块中这种拆分的重复实例?例如:“这只是一个简单的句子。这是一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。目前它匹配整个字符串,而不是每个实例。【参考方案2】:

需要惰性量词

重新提出这个问题,因为接受答案中的正则表达式对我来说似乎不太正确。为什么?因为

(?<=This is)(.*)(?=sentence)

将匹配my first sentence. This is my second 中的This is my first sentence. This is my second sentence.

See demo

您需要在两个lookarounds 之间添加一个惰性量词。添加? 会使明星变得懒惰。

这符合您的要求:

(?<=This is).*?(?=sentence)

See demo。我删除了不需要的捕获组。

DOTALL 模式以匹配换行符

请注意,在演示中设置了“点匹配换行模式”(又名)点全部(参见how to turn on DOTALL in various languages)。在许多正则表达式风格中,您可以使用在线修饰符 (?s) 对其进行设置,将表达式变为:

(?s)(?<=This is).*?(?=sentence)

参考

The Many Degrees of Regex Greed Repetition with Star and Plus

【讨论】:

您对捕获组是正确的。不知道我为什么这样做。但是.*.*? 之间的区别也在我的回答(“更新”之前的段落)中进行了解释。所以我不认为我的回答是错误的。 @stema 对吹毛求疵感到抱歉,昨天浏览您的一些答案时,这是唯一让我抽搐的答案。 :) 我将第一行从 is incorrect 软化为 doesn't seem quite correct to me... 希望这不会让 抽搐,可能只是对如此高流量的正则表达式的看法不同答案应该是。【参考方案3】:

试试This is[\s\S]*?sentence,在javascript中工作

【讨论】:

这种方式如何进行惰性查找? @AwQiruiGuo 同上。 [\s\S]*?(也称为:非贪婪通配符)【参考方案4】:

这个:

This is (.*?) sentence

在 javascript 中工作。

【讨论】:

【参考方案5】:

使用这个:(?&lt;=beginningstringname)(.*\n?)(?=endstringname)

【讨论】:

不知道为什么所有的赞成票,这允许0-1换行,并且换行必须紧接在endstringname之前 我发现删除日志行的开头(时间戳等)很有用。我使用新行作为开始字符串,使用“at”作为结束字符串。【参考方案6】:

这对我有用(我正在使用 VS Code):

对于: This is just\na simple sentence

使用: This .+ sentence

【讨论】:

正是我想要的!谢谢! 这比其他解决方案更具可读性和易记性【参考方案7】:

如果有人在 Jenkins 上下文中寻找这样的例子。它解析 build.log,如果找到匹配项,则匹配失败。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

node    
    stage("parse")
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() 
            capturedText = match.group(1)
            error(capturedText)
        
    

【讨论】:

【参考方案8】:

RegEx 使用 Java 方法匹配两个字符串之间的所有内容。

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

让我们使用 Pattern 和 Matcher 对象来使用 RegEx (.?)*.

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

由于 Matcher 可能包含多个匹配项,我们需要遍历结果并存储它。

while(m.find())   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.

此示例将仅包含 “将保存” 字词,但在较大的文本中可能会找到更多匹配项。

【讨论】:

【参考方案9】:

你可以简单地使用这个:\This is .*? \sentence

【讨论】:

【参考方案10】:

我在这里搜索 regex 以在 print"string" 之间转换此打印语法,在 Python2 中的旧脚本中使用:print("string"),对于 Python3。效果很好,否则使用 2to3.py 进行额外的转换。这是我对其他人的解决方案:

在 Regexr.com 上试用(由于某种原因在 NP++ 中不起作用):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

对于变量:

(?<=print)( )(.*)(\n)
('$2')\n

对于标签和变量:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

How to replace all print "string" in Python2 with print("string") for Python3?

【讨论】:

【参考方案11】:

有一种方法可以处理文本块中这种拆分的重复实例吗?例如:“这只是一个简单的句子。这是一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。要匹配每个实例而不是整个字符串,请使用以下代码:

data = "This is just\na simple sentence. Here is some additional stuff. This is just\na simple sentence. And here is some more stuff. This is just\na simple sentence."

pattern = re.compile('This is (?s).*? sentence')

for match_instance in re.finditer(pattern, data):
    do_something(match_instance.group())

【讨论】:

如果我想在两个连续的之间获取文本怎么办?这只是\n个简单的句子。模式?【参考方案12】:

我是这样做的: 这对我来说比试图找出必要的特定正则表达式更容易。

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 

【讨论】:

【参考方案13】:

要在 VIM 中快速搜索,您可以使用 在 Vim 控制提示符下:/This is.*\_.*sentence

【讨论】:

【参考方案14】:

崇高文本 3x

在崇高的文本中,您只需写下您感兴趣的两个单词,例如在您的情况下它是

“这是”和“句子”

你在两者之间写.*

This is .* sentence

这应该对你有好处

【讨论】:

不确定问题是关于如何在 Sublime Text 中执行此操作,但主要适用于 Sublime Text。当“This is”和“sentence”之间恰好有换行符时,它不起作用。此外,sublime text 还会选择“This is”和“Sentence”,而不仅仅是这两个字符串之间的文本。

以上是关于正则表达式匹配两个字符串之间的所有字符的主要内容,如果未能解决你的问题,请参考以下文章

javascript正则表达式匹配两个字符串之间的所有内容(没有换行符)[重复]

两个字符串之间的正则表达式匹配?

两个字符串之间的正则表达式匹配,包括那些字符串

js正则表达式 匹配两个特定字符间的内容

用正则表达式匹配连字符之间的文本

使用正则表达式查找两个字符串之间的多个匹配项