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)

看看 C#/.net 中相当于 $2 的内容

秘密在于惰性匹配构造(。*?)——我假设/希望 C# 支持这一点。

显然,Jon Skeet 的解决方案会表现得更好,但您可能想要使用正则表达式(例如,简化分解您感兴趣的位)。

(免责声明:我自己是 Perl/Python/Ruby 的人......)

于 2008-11-25T10:26:11.553 回答