查詞

2008-11-25 35 views
1

最後一次出現,我有以下字符串:查詞

<SEM>electric</SEM> cu <SEM>hello</SEM> rent <SEM>is<I>love</I>, <PARTITION />mind 

我想找到最後的「SEM」開始「分區」標籤之前的標籤。不是SEM結束標籤,而是開始標籤。結果應該是:

<SEM>is <Im>love</Im>, <PARTITION /> 

我已經試過正則表達式:

<SEM>[^<]*<PARTITION[ ]/> 

,但如果最後的「SEM」和「分區」標籤沒有他們之間的任何其他標記它纔會起作用。有任何想法嗎?

回答

3

而且這裏是你的愚蠢的正則表達式!

(?=[\s\S]*?\<PARTITION)(?![\s\S]+?\<SEM\>)\<SEM\> 

什麼,說是「雖然前面傳來一個分區標記......但在未來是不是又SEM標籤...匹配SEM標籤。」

享受!

下面是正則表達式分解:

(?=[\s\S]*?\<PARTITION) means "While ahead somewhere is a PARTITION tag" 
(?![\s\S]+?\<SEM\>) means "While ahead somewhere is not a SEM tag" 
\<SEM\> means "Match a SEM tag" 
0

你有沒有嘗試過這樣的:

<EM>.*<PARTITION\s*/> 

你的正則表達式是匹配的 「EM」 標籤之後什麼,但 「<」。因此,它會在關閉「EM」標籤時停止匹配。

+0

亞我已經試過這一個從第一SEM匹配,直到分區標記...感謝anywaz – shabby 2008-11-25 11:19:33

7

使用String.IndexOf找到PARTITION和String.LastIndexOf找到SEM?

int partitionIndex = text.IndexOf("<PARTITION"); 
int emIndex = text.LastIndexOf("<SEM>", partitionIndex); 
+0

這就是真正的GR8喬恩但母艦一樣已經好多了,如果UD幫助我用正則表達式..... PLZ thnask anywasy – shabby 2008-11-25 11:22:26

+0

爲什麼會更好?如果這種方法適用於你所需要的,你爲什麼要用正則表達式來淹沒水域? – ZombieSheep 2008-11-25 11:31:44

+0

愚蠢的問題......如果他需要什麼這對於一個正則表達式驗證。 :) – 2008-11-25 11:34:23

0

位快速和骯髒的,但試試這個:

(<SEM>.*?</SEM>.*?)*(<SEM>.*?<PARTITION) 

,並看看什麼是在偷懶$ 2

祕密就在C#/。NET等同。匹配結構(。*?)---我假設/希望C#支持這一點。顯然,Jon Skeet的解決方案會表現得更好,但您可能想要使用正則表達式(例如,簡化分解您感興趣的位)。

(聲明:我是一個Perl/Python的/ Ruby的人自己...)

1

的解決方案是這樣的,我在http://regexlib.com/RETester.aspx

<\s*SEM\s*>(?!.*</SEM>.*).*<\s*PARTITION\s*/> 

已經測試正如你想的最後一節,以確定唯一的辦法是隻找不包含</SEM>的字符。

如果在<SEM> or <PARTITION/>有一些空格,我已經包含「\ s *」。

基本上,我們所做的是將單詞</SEM>

(?!.*</SEM>.*) 
2

如果你要使用正則表達式找到的東西最後一次出現,那麼你可能還需要使用從右至左正則表達式解析選項:

new Regex("...", RegexOptions.RightToLeft);