Regex-带有标点符号的句子加上换行符和段落

本文关键字:换行符 段落 句子 标点符号 Regex- | 更新日期: 2023-09-27 18:23:46

我的regex经验有限,我一直在修补一个尚未解决的问题。我怀疑对于其他有更多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或数字。

谢谢黄油

Regex-带有标点符号的句子加上换行符和段落

这里有一个简单的解决方案:

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

不过,这将无法确保<p>标记正确嵌套,并且将允许标记上的属性。

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

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

这使用了平衡组(我更喜欢.NET正则表达式来支持递归,但这是另一个主题)。它仍然允许在打开的<p>标记上使用属性。

RegexHero演示

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