正则表达式 - 带标点符号加句子和段落的句子

时间:2014-09-21 22:46:32

标签: c# regex

我的正则表达式经验有限,而且我一直在修补我尚未设法解决的问题。我怀疑对于具有更多正则表达式经验的其他人来说相对容易,所以任何指针都会受到赞赏。

上下文。我需要能够验证一个句子,该句子可以包含a-z(两种情况),0-9,空格,标准标点符号以及<br /><p></p>.

我在C#中编写了一些测试,如下所示。

[TestCase("123345acbcbbc ab")]
[TestCase("123 abc")]
[TestCase("aBcC 123 123! abc; 'k21HdD_-{};:")]
[TestCase("123!")]
[TestCase("aBcC<br />123 123!<br />abc; 'k21HdD_-{};:")]
public void WhenValidatingASentence_ThenStandardPunctuation_IsSupported(string sut)
{
    Assert.That(Regex.IsMatch(sut, @"^[a-zA-Z0-9]+[\sa-zA-Z0-9\p{P}]+?(<br\s/>)+?$"), Is.True);
}

前四个测试用例工作正常,但是在模式和输入中引入中断导致第五种情况失败。

很明显,我误解了捕获组的使用或者说它的规格很糟糕。任何指导将不胜感激。

毋庸置疑,字符串的所有部分都可以重复,因此段落和符号,以及字符,数字和标点符号可以在整个句子中多次使用,尽管我希望开头必须是a-z或数字。

由于 脂

1 个答案:

答案 0 :(得分:1)

这是一个简单的解决方案:

^(?:[0-9a-zA-Z \p{P}]+|<(?:br|/?p)[^>]*>)+$

这不能确保<p>标签已正确嵌套,并且它将允许标签上的属性。

如果你想确保<p>标签是平衡的,那么正则表达式会变得更复杂:

^(?:
(?>[0-9a-zA-Z \p{P}]+)
|<br\s*>
|(?<para>)<p[^>]*>
|(?<-para>)</p\s*>
)+(?(para)(?!))$

这使用balancing groups(我更喜欢.NET正则表达式来支持递归,但这是一个不同的主题)。它仍然允许在开始<p>标记上添加属性。

RegexHero demo

编辑:我刚注意到你想要开始是字母数字。如果您想强制执行此操作,只需在[a-zA-Z0-9]锚点后添加^