ste*_*ema 562
例如
(?<=This is)(.*)(?=sentence)
Run Code Online (Sandbox Code Playgroud)
我使用了lookbehind (?<=)并向前看,(?=)因此"This is"和"sentence"不包括在匹配中,但这取决于你的用例,你也可以简单地写一下This is(.*)sentence.
这里重要的是你激活你的正则表达式引擎的"dotall"模式,以便.匹配换行符.但是你如何做到这一点取决于你的正则表达式引擎.
接下来就是你使用.*或者.*?.第一个是贪婪的,将匹配到你的字符串中的最后一个"句子",第二个是懒惰的,将匹配到你的字符串中的下一个"句子".
更新
This is(?s)(.*)sentence
Run Code Online (Sandbox Code Playgroud)
其中(?s)打开dotall修饰符,使.匹配换行符.
更新2:
(?<=is \()(.*?)(?=\s*\))
Run Code Online (Sandbox Code Playgroud)
是匹配你的例子"这是(一个简单的)句子".请参阅Regexr
zx8*_*x81 162
恢复这个问题,因为接受的答案中的正则表达式对我来说似乎不太正确.为什么?因为
(?<=This is)(.*)(?=sentence)
Run Code Online (Sandbox Code Playgroud)
将匹配my first sentence. This is my second在This is my first sentence. This is my second sentence.
见演示.
在两个外观之间需要一个懒惰的量词.添加一个?让这个明星变得懒惰.
这符合你的要求:
(?<=This is).*?(?=sentence)
Run Code Online (Sandbox Code Playgroud)
见演示.我删除了不需要的捕获组.
DOTALL模式匹配跨线断点
请注意,在演示中,"点匹配换行模式"(又名)dot-all已设置(请参阅如何在各种语言中打开DOTALL).在许多正则表达式中,您可以使用在线修饰符设置它(?s),将表达式转换为:
(?s)(?<=This is).*?(?=sentence)
Run Code Online (Sandbox Code Playgroud)
参考
对于 JavaScript,您可以用来[^]匹配任何字符,包括换行符。
使用/s带有点的标志.来匹配任何字符也可以,但应用于整个模式,并且 JavaScript 不支持内联修饰符来打开/关闭标志。
为了匹配尽可能少的字符,您可以通过附加问号来使量词变得非贪婪,并使用捕获组来提取之间的部分。
This is([^]*?)sentence
Run Code Online (Sandbox Code Playgroud)
请参阅regex101 演示。
作为旁注,为了不匹配部分单词,您可以使用单词边界,例如\bThis和sentence\b
This is([^]*?)sentence
Run Code Online (Sandbox Code Playgroud)
JavaScript 中的环视变体是(?<=This is)[^]*?(?=sentence),您可以检查JS 正则表达式中的环视以获取支持。
另请参阅有关 Lookbehind 的重要说明。
const s = "This is just\na simple sentence";
const regex = /This is([^]*?)sentence/;
const m = s.match(regex);
if (m) {
console.log(m[1]);
}Run Code Online (Sandbox Code Playgroud)