2011-05-23 64 views
4

我想匹配使用lookarounds的字符串的一部分,但只有其他字不包含在行中。正則表達式 - 與條件查找匹配嗎?

有些熊生活在樹林裏吃東西。

在上述行

,我想找到(之間的「生活和」 &「在吃」「林子):

/(?<=\blive and\b).*?(?=\bwoods\b)/ 

,但只有當‘熊’不分開。行,要麼後,之前或lookarounds之間

,不應該返回匹配行的其他例子是:

有些動物吃住在 樹林,像熊一樣。

有些動物在 森林裏生活和吃熊。

如何將此條件添加到我的正則表達式中?

+0

live andwoods之間

匹配嗎? – Kobi 2011-05-23 04:57:17

+0

ActionScript 3.0 – TheDarkIn1978 2011-05-23 05:59:54

回答

4

這是有問題的,因爲大多數口味不支持可變長度後視,所以你不能檢查整條線。一個簡單的方法是將整個行,而不是使用相匹配的lookarounds:

^(?!.*\bbears\b).*?\blive and\b(.*?)\bwoods\b 

這裏,什麼以前是整場比賽的第一個捕獲組。取決於你使用它,它可能會使這個文本取代一些不太方便。確保使用muliline標誌(/m),而不是設置單行標誌(dot-all或/s)。

工作例如:http://rubular.com/r/TuADb2vB4w

注意,這個問題就變得非常簡單,如果你可以分兩步解決這個問題:過濾掉\bbears\b線,並匹配期望字符串。

+0

它肯定會在兩個步驟中更具可讀性。這是很好的建議。謝謝。 – TheDarkIn1978 2011-05-23 06:46:36

+0

都鐸王朝的答案大部分適用,但多線失敗。你有什麼想法嗎? – TheDarkIn1978 2011-05-23 19:43:57

1

你的問題和例子似乎並不匹配,但你可以這樣做:

(?!.*\bbears\b)(?<=\blive and\b).*?(?=\bwoods\b) 

(只擴大你的正則表達式)

+0

它錯過了比賽前出現「熊」的情況。我不認爲太多的口味支持這種外觀,這就是爲什麼我嘗試了全線方法。 (.Net在這裏是一個例外,類似'(?<!^(?=。* \ bbears \ b)。*)',但這個問題可能是使用動作腳本) – Kobi 2011-05-23 05:29:45

2

在Perl:

use strict; 
use warnings; 

my $a = "Some bears live and eat in the woods."; 

#$a = "Some animals live and eat in the woods, like bears."; 

$a = "Some animals live and eat bears in the woods."; 

$a =~ /(?(?!.*bears.*)(.*\blive and\b(.*)\bwoods\b.*)|(.{0}))/g; 

print $2; 

條件?(?!.*bears.*)就像

if the string contains the bears string 
    then matches .*\blive and\b(.*)\bwoods\b.* 
    else matches .{0} 

你幾乎不需要lookarounds閱讀您正在使用什麼語言更多關於Regex Conditionals here

+1

謝謝!這很好用!看起來else是可選的(至少在AS3中),如下所示:myString.match(new RegExp(「(?(?!。* \\ bbears \\ b。*)((?<= \\ blive and \\ b)。*?(?= \\ bwoods \\ b)))「,」g「))); – TheDarkIn1978 2011-05-23 06:38:48

+0

humm。我可能在這裏得出結論。此解決方案似乎不適用於多行,即使設置了多行標誌。在任何帶有「熊」的行之後出現的實際匹配行被忽略。任何想法/建議? – TheDarkIn1978 2011-05-23 16:46:31

+0

你如何期待它對多重弦發揮作用? – 2011-05-24 03:44:33