1

次の文字列があります。

<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」タグの間に他のタグがない場合にのみ機能します。何か案は?

4

6 に答える 6

7

String.IndexOfを使用して PARTITION を検索し、String.LastIndexOfを使用して SEM を検索しますか?

int partitionIndex = text.IndexOf("<PARTITION");
int emIndex = text.LastIndexOf("<SEM>", partitionIndex);
于 2008-11-25T10:00:51.353 に答える
3

そして、これがあなたの間抜けな正規表現です!!!

(?=[\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"
于 2008-11-25T11:36:11.693 に答える
2

何かの最後の出現を見つけるために正規表現を使用する場合は、右から左への解析正規表現オプションを使用することもできます。

new Regex("...", RegexOptions.RightToLeft);
于 2008-11-26T02:26:16.170 に答える
1

解決策はこれです、私はhttp://regexlib.com/RETester.aspxでテストしました

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

最後のものが必要なため、識別する唯一の方法は、を含まない文字のみを見つけることです</SEM>

にスペースがある場合に備えて、「\s*」を含めました<SEM> or <PARTITION/>

基本的に、次のように単語を除外</SEM>します。

(?!.*</SEM>.*)
于 2008-11-25T12:32:32.763 に答える
0

これを試しましたか:

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

正規表現は、「EM」タグの後の「<」以外のものと一致していました。したがって、「EM」終了タグにヒットすると、マッチングが停止します。

于 2008-11-25T09:59:32.590 に答える
0

少し手早く汚いですが、これを試してください:

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

$2 に相当する C#/.net の内容を見てみましょう

その秘密は、遅延一致構造 (.*?) にあります --- C# がこれをサポートしていると思います/期待しています。

明らかに、Jon Skeet のソリューションの方が優れたパフォーマンスを発揮しますが、正規表現を使用することもできます (たとえば、関心のある部分を簡単に分割するため)。

(免責事項:私はPerl / Python / Rubyの人です...)

于 2008-11-25T10:26:11.553 に答える