2014-03-04 26 views
0

我知道你可以阻止從正確的貪婪正則表達式使用「?」標誌。但左側呢?假設我有這個:如何阻止從左邊的貪婪正則表達式

X test X junk X Hello Y junk2 Y 

如何強制它只在X和Y之間選擇「Hello」?

我至今正則表達式:

/X(.*?)Y/g 

謝謝。

+0

貪婪的操作符正在做它應該做的事情。從第一個X中,選擇Y的最小字符。 –

+0

@RobertSlaney:你將如何翻譯'從最右邊的X中選擇...在正則表達式中? – Reacen

+1

這取決於您正在使用的正則表達式引擎,以及您是否有向後斷言(JavaScript不)。下面的Nambi的解決方案找到X和Y之間不包含X和Y的所有文本 –

回答

1

您可以使用像下面這樣的模式:/X\s+([^XY]+)\s+Y/g

1

你可以使用這個模式X([^XY]+)Y/g

1

嘗試這種模式:/.*X(.*?)Y/gDemo

+0

無法正常工作的直接匹配選擇器,它會返回:'X test X junk X Hello Y' – Reacen

+1

@Reacen look at Demo Match1 should be你在找什麼 –

+1

如果你刪除了它的全局標誌,但取決於正則表達式引擎可能會有超過1個匹配。在javascript中第二個匹配包含字符串「Hello」'X test X junk X Hello Y junk2 Y「.match(/.* X(。*?)Y /)[1]' –

1

反向搜索前,目標字符串,然後搜索顛倒正則表達式。在蟒蛇:

m=re.search(r'Y(.*?)X',reversed(s)) 
if m: 
    return reversed(m.group(1)) 
+0

同樣的問題,有2個」Y 「s。答案將會是X你好Y junk2 Y –

+0

我錯過了右邊的第二個Y.這個想法只有在右邊有一個獨特的模式時纔有效。 –

0

在Perl以下工作:

$_='X test X junk X Hello Y junk2 Y'; 
if (/X(?!.*X)(.*?)Y/) { 
    print "$1\n"; 
} 
else { 
    print "No match!\n"; 
} 

(?!.*X)可以確保第一X後面沒有第二個。