我们目前正在为我们的软件实施一个小标签系统。只有两种不同的标记样式:单个,多个。
单身看起来像这样:
<<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时忽略某些事情非常容易。
答案 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*>>
,那么您需要一个合适的解析器。