检查是否需要RegEx

时间:2012-02-06 14:39:31

标签: c# .net regex

我们目前正在为我们的软件实施一个小标签系统。只有两种不同的标记样式:单个多个

单身看起来像这样:

<<Single_Tag>>

多个看起来像这样:

<<Multiple_Tag*>>
... stuff between tag ...
<</Multiple_Tag*>>

RegEx找到单一的将是:

<<\w+>>

RegEx找到多个将是:

<<(\w+)\*{1}>>((.|\s)*)<</(\w+)\*{1}>>

是否需要{1}?我是对的,(.|\s)*需要贪婪吗?否则此RegEx将失败:

<<multiple_tag1*>>
    <<multiple_tag2*>>

    <</multiple_tag2*>>
<</multiple_tag1>>

捕捉群体是否有更简单的方法?对不起,如果以下语法错误。我上次使用RegEx的时间是几年前:

<<(\w+)\*{1}>>((.|\s)*)<</($1)\*{1}>>

$1代表第一个捕获组。我正在开发 .NET 。我已经在RegExr检查了这些。但我只记得:在使用RegEx时忽略某些事情非常容易

2 个答案:

答案 0 :(得分:0)

请参阅以下文章关于使用正则表达式解析html,因为它也适用于此(我的首选。堆栈溢出帖子)。

RegEx match open tags except XHTML self-contained tags

<强>更新

解决这个问题的一种方法是:

1)构建一个tokenizer,将你的输入标记为令牌序列,其中每个令牌是以下之一:

* Non-Tag (contains all the content)
* Open-Tag (contains the name of the tag)
* Close-Tag  (contains the name of the tag)

2)循环调用标记生成器,并手动记录开始结束标记,确保它们正确平衡。

步骤(1)可以使用词法生成器自动化。在理论上,步骤(2)可以由解析器生成器自动化,但在这种情况下这可能是过度的。

.NET中使用的常见词法分析器和解析器生成器是ANTLR

示例

此输入

<<Multiple_Tag*>>
... stuff between tag ...
<</Multiple_Tag*>>

会生成以下令牌:

 1. Open-Tag("Multiple_Tag")
 2. Non-Tag("\n    ... Stuff between tag ... \n")
 3. Close-Tag("Multiple_Tag")

答案 1 :(得分:0)

正则表达式不能用于保持计数。如果您需要任何可以计算的东西,例如已经传递了多少<<Multiple_Tag*>>,那么您需要一个合适的解析器。