簡體   English   中英

查找單詞的最后一次出現

[英]Finding the last occurrence of a word

我有以下字符串:

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

我想在“ PARTITION”標簽之前找到最后一個“ SEM”開始標簽。 不是SEM結束標簽,而是開始標簽。 結果應為:

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

我試過這個正則表達式:

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

但是只有在最后的“ SEM”和“ PARTITION”標簽之間沒有其他標簽時,它才有效。 有任何想法嗎?

使用String.IndexOf查找PARTITION,使用String.LastIndexOf查找SEM?

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

這是您愚蠢的Regex !!!

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

這就是說:“在某處的前面是一個PARTITION標簽……但是在前面的不是另一個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"

如果要使用正則表達式查找某些內容的最后出現,那么您可能還希望使用從右至左的解析正則表達式選項:

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

解決方案是這樣,我已經在http://regexlib.com/RETester.aspx中進行了測試

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

正如您想要的最后一個一樣,唯一的識別方法是僅查找不包含</SEM>的字符。

如果<SEM> or <PARTITION/>有一些空格,我會添加“ \\ s *”。

基本上,我們要做的是將</SEM>排除在外:

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

您是否嘗試過:

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

您的正則表達式在“ EM”標記后匹配除“ <”以外的任何內容。 因此,當它碰到關閉的“ EM”標簽時,它將停止匹配。

有點麻煩,但請嘗試以下操作:

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

看看C#/。net中相當於$ 2的內容

秘密在於延遲匹配的構造(。*?)---我認為/希望C#支持這一點。

顯然,喬恩·斯基特(Jon Skeet)的解決方案性能會更好,但是您可能要使用正則表達式(例如,以簡化分解您感興趣的部分)。

(免責聲明:我本人是Perl / Python / Ruby人...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM