【发布时间】:2008-11-26 06:05:37
【问题描述】:
我有两个字符串
<EM>is <i>love</i></EM>,<PARTITION />
和
<EM>is <i>love</i>,<PARTITION />
我想要一个正则表达式完全匹配第二个字符串,但不应该匹配第一个。请帮忙。
注意:除了 EM 和 PARTITION 标签之外,一切都可以改变。
【问题讨论】:
我有两个字符串
<EM>is <i>love</i></EM>,<PARTITION />
和
<EM>is <i>love</i>,<PARTITION />
我想要一个正则表达式完全匹配第二个字符串,但不应该匹配第一个。请帮忙。
注意:除了 EM 和 PARTITION 标签之外,一切都可以改变。
【问题讨论】:
如果要完全匹配不包含某个子字符串的字符串,请使用正则表达式匹配子字符串,如果正则表达式不匹配则返回整个字符串。你没有说你使用的是哪种语言,但你用 .NET 标记了你的问题,所以这里是 C#:
if (Regex.IsMatch(subjectString, "</EM>")) {
return null;
} else {
return subjectString;
}
由于只是一点点文字,你甚至不需要使用正则表达式:
if (subjectString.Contains("</EM>")) {
return null;
} else {
return subjectString;
}
在你只能使用正则表达式的情况下,试试这个:
\A((?!</EM>).)*\Z
纯正则表达式解决方案的效率将远低于上述代码示例。
【讨论】:
我认为你问的问题不正确。这个正则表达式完全匹配第二个字符串而不是第一个:
/^是爱,$/
但很明显,你想匹配一类字符串,而不仅仅是第二个字符串……对吧?定义您要匹配的字符串类别,您可以更接近获得所需的正则表达式。
【讨论】:
^<EM>(?:(?<!</EM>).)*<PARTITION />$
有效。但这取决于目标语言,例如 JavaScript,不支持环视断言...
一个更简单的解决方案是使用^<EM>.*<PARTITION />$,然后检查字符串中没有</EM>:我相信REs 是强大的并且是必须的,但我不会尝试只在一个表达式中做所有事情。 .. :-)
【讨论】:
幸运的是,经历了这一切并对此进行了大量研究,我找到了正确的正则表达式............这里适合你们......感谢所有帮助过的人
<EM>\w*\s*\W*\S*[^\(</EM>)]<PARTITION[ ]/>
捕获第二个字符串但保留第一个字符串....我遇到的唯一问题是否定</EM>组合,我在组之前用反斜杠做了,这否定了完整的字符串而不是单独获取字符....
【讨论】: