使用正则表达式匹配“标签”和“文本”

时间:2014-09-25 15:38:54

标签: c# regex

我在(html)文本中有自定义标记。从这个自定义标记我只需要它的单个特定属性。 需要的是:

不是自定义标记的文本匹配(包括常规html标记)。(命名为:text)

自定义标记(mytag)上的匹配项以及属性(tagattribute)上的匹配项

我可以像这样匹配标签:

(?<mytag><my-tag\ data-tag='(?<TagAttribute>.*?)'>.*?</my-tag>)

如果&#34;拆分&#34;这个正则表达式的样本我得到了我需要的所有部分:

<p>some text<my-tag data-tag='first'>in the tag</my-tag></p> stuff in between<my-tag data-tag='second'>in the second tag </my-tag>after the tags

result:

如何将它与这样的东西结合起来,捕获任何直到新my-tag开头的东西:

(?<text>((.(?!<my-tag))*(.)))

这样当我调用NextMatch时,我会收到一个&#34;文本&#34;或者是&#34; mytag&#34;和&#34; tagattribute&#34;。

我使用Regulator和此单元测试来查看C#正则表达式对它的影响

 [TestMethod]
 public void RegExTokenizerTest()
 {
    //arrange
    const string expression =
        @"(?<TemplateTag><my-tag\ data-tag='(?<TagAttribute>.*?)'>.*?</my-tag>)";
    const string target =
        @"<p>some text<my-tag data-tag='first'>in the tag</my-tag></p> stuff in between<my-tag data-tag='second'>in the second tag </my-tag>after the tags";
     Regex regex = 
         new Regex(
            expression,
            RegexOptions.IgnoreCase | 
            RegexOptions.CultureInvariant |
            RegexOptions.Multiline
     );
     // act

     Match match = regex.Match(target);
     while (match.Success)
     {
         ProcessMatches(match.Captures);
         match.NextMatch();
      }

      // assert
      // ...
  }

得到了

我所需要的只是一个&#34; |&#34; (或)

(?<TemplateTag><my-tag\ data-tag='(?<TagAttribute>.*?)'>.*?</my-tag>)|(?<text>((.(?!<my-tag))*(.)))

0 个答案:

没有答案