[英]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.