【问题标题】:HTML last tag conditional matchHTML最后一个标签条件匹配
【发布时间】:2008-11-26 06:05:37
【问题描述】:

我有两个字符串

<EM>is <i>love</i></EM>,<PARTITION />

<EM>is <i>love</i>,<PARTITION />

我想要一个正则表达式完全匹配第二个字符串,但不应该匹配第一个。请帮忙。

注意:除了 EM 和 PARTITION 标签之外,一切都可以改变。

【问题讨论】:

  • 澄清:哪些部分是可变的?除了“是爱”,我还能有什么,我能有
  • 是的,你可以拥有它,除了 EM 和 PARTITION 标签之外,所有东西都是可变的

标签: .net regex


【解决方案1】:

如果要完全匹配不包含某个子字符串的字符串,请使用正则表达式匹配子字符串,如果正则表达式不匹配则返回整个字符串。你没有说你使用的是哪种语言,但你用 .NET 标记了你的问题,所以这里是 C#:

if (Regex.IsMatch(subjectString, "</EM>")) {
    return null;
} else {
    return subjectString;
} 

由于只是一点点文字,你甚至不需要使用正则表达式:

if (subjectString.Contains("</EM>")) {
    return null;
} else {
    return subjectString;
} 

在你只能使用正则表达式的情况下,试试这个:

\A((?!</EM>).)*\Z

纯正则表达式解决方案的效率将远低于上述代码示例。

【讨论】:

    【解决方案2】:

    我认为你问的问题不正确。这个正则表达式完全匹配第二个字符串而不是第一个:

    /^,$/

    但很明显,你想匹配一类字符串,而不仅仅是第二个字符串……对吧?定义您要匹配的字符串类别,您可以更接近获得所需的正则表达式。

    【讨论】:

    • 对不起,我的意思是如果字符串在第二个字符串上运行它匹配它并且如果在第一个字符串上运行则不匹配任何东西
    【解决方案3】:
    ^<EM>(?:(?<!</EM>).)*<PARTITION />$
    

    有效。但这取决于目标语言,例如 JavaScript,不支持环视断言...

    一个更简单的解决方案是使用^&lt;EM&gt;.*&lt;PARTITION /&gt;$,然后检查字符串中没有&lt;/EM&gt;:我相信REs 是强大的并且是必须的,但我不会尝试只在一个表达式中做所有事情。 .. :-)

    【讨论】:

      【解决方案4】:

      幸运的是,经历了这一切并对此进行了大量研究,我找到了正确的正则表达式............这里适合你们......感谢所有帮助过的人

      <EM>\w*\s*\W*\S*[^\(</EM>)]<PARTITION[ ]/>
      

      捕获第二个字符串但保留第一个字符串....我遇到的唯一问题是否定&lt;/EM&gt;组合,我在组之前用反斜杠做了,这否定了完整的字符串而不是单独获取字符....

      【讨论】:

      • 这不起作用,因为“[^\()]”描述了一个字符类,而不仅仅是假设的“”。
      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      相关资源
      最近更新 更多