0

我正在尝试构建一个在第一次出现时停止的正则表达式。我知道我可以通过把?.

考虑一个字符串:

"This is sample text located at first line and located at second line."

在这里,我正在寻找pattern1使用pattern2.

  • pattern1"text"
  • pattern2"located at"

在上面的字符串中,我想提取"text",我的搜索模式是"located at",所以我使用以下正则表达式:

/is.*sample(.*)located at?/

我如何做到located at不贪心?我正在使用http://rubular.com/来验证我的正则表达式。

4

1 回答 1

2

您的正则表达式不正确。

如果您想要在第一个“位于”之前出现的单个“单词”,您可以使用:

"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'”,这不是你想要的,因为那会匹配“一”或“在”。

于 2012-12-06T15:12:45.003 回答