您的正则表达式不正确。
如果您想要在第一个“位于”之前出现的单个“单词”,您可以使用:
"This is sample text located at first line and located at second line."[/(\S+)\s+located at/, 1]
=> "text"
我将“单词”定义为使用 的非空白字符\S
,因此标点符号和数字将包含在字母字符中。可以使用其他类,例如,\w
如果您想要[A-Za-z0-9_]
. 否则使用[a-z]
如下:
"This is sample text located at first line and located at second line."[/([a-z]+)\s+located at/i, 1]
=> "text"
如果您想要任何出现在“样本”和第一个“位于”之间的文本,您可以使用:
"This is sample text located at first line and located at second line."[/sample\s+(.+?)\s+located at/, 1]
=> "text"
在您的模式/test.*sample(.*)located at?/
中,您正在使用 multiple .*
,这意味着任何东西的零个或多个(但是,实际上并不是任何东西,具体取决于上下文,但这比我们现在需要做的更深)。那个“更多”是你正在碰撞的部分,因为它是贪婪的。而且,因为你使用了两次,所以它是双重贪婪的。您可以通过添加来使用“非贪婪”变体?
,但它仍然无法正常工作,因为您给正则表达式引擎提供了太多可玩的绳索。我的模式收紧了这一切,减少了?
在前两个中使用修饰符的需要。
我的第三个示例需要它,因为再一次,它.+
会很贪婪并且需要适度。
最后,at?
在您的模式不适?
用于修改.*
,它作用于前面的t
,导致引擎“必须找到零或一't'”,这不是你想要的,因为那会匹配“一”或“在”。