正则expression式匹配两个string之间的所有字符

例如:“这只是简单的句子”。

我想匹配“This is”和“sentence”之间的每个字符。 换行应该被忽略。 我无法弄清楚正确的语法。

例如

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

Regexr

我使用了lookbehind (?<=)并向前看(?=)以便“This is”和“sentence”不包含在匹配中,但这取决于您的使用情况,您也可以简单地写This is(.*)sentence

这里重要的是你激活你的正则expression式引擎的“dotall”模式, 与换行符匹配。 但你如何做到这一点取决于你的正则expression式引擎。

接下来的事情是如果你使用.*.*? 。 第一个是贪婪,会匹配到你的string中的最后一个“句子”,第二个是懒惰的,会匹配到你的string中的下一个“句子”。

更新

Regexr

 This is(?s)(.*)sentence 

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

更新2:

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

与你的例子相匹配“这是一个简单的句子”。 在这里看Regexr

懒惰的量词需要

复活这个问题,因为在接受的答案中的正则expression式对我来说似乎不太正确。 为什么? 因为

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

会匹配my first sentence. This is my second my first sentence. This is my second This is my first sentence. This is my second sentence. This is my first sentence. This is my second sentence.

看演示

你需要在两个variables之间有一个懒惰的量词。 添加一个? 使明星懒惰。

这匹配你想要的:

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

看演示 。 我删除了不需要的捕获组。

DOTALL模式匹配跨越线路断点

请注意,在演示中,“点匹配换行符模式”(aka)dot-all已设置(请参阅如何以各种语言启用DOTALL )。 在许多正则expression式中,可以使用在线修饰符(?s)来设置它,将expression式转换为:

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

参考

  • 正则expression式贪婪的许多程度
  • 重复与星和加号

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

使用这个: (?<=beginningstringname)(.*\n?)(?=endstringname)

这个:

 This is (.*?) sentence 

在JavaScript中工作。

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