需要RegEx才能返回第一段或前n个单词

Lei*_*ers 4 c# regex

我正在寻找RegEx来返回段落中的第一个[n]单词,或者如果段落包含少于[n]个单词,则返回完整的段落.

例如,假设我最多需要前7个单词:

<p>one two <tag>three</tag> four five, six seven eight nine ten.</p><p>ignore</p>
Run Code Online (Sandbox Code Playgroud)

我得到:

one two <tag>three</tag> four five, six seven
Run Code Online (Sandbox Code Playgroud)

对包含少于请求的字数的段落使用相同的RegEx:

<p>one two <tag>three</tag> four five.</p><p>ignore</p>
Run Code Online (Sandbox Code Playgroud)

简单地回复:

one two <tag>three</tag> four five.
Run Code Online (Sandbox Code Playgroud)

我对此问题的尝试产生了以下RegEx:

^(?:\<p.*?\>)((?:\w+\b.*?){1,7}).*(?:\</p\>)
Run Code Online (Sandbox Code Playgroud)

但是,这只返回第一个单词 - "one".它不起作用.我觉得 .*?(在\ w +\b之后)导致问题.

我哪里错了?任何人都可以提出一个有效的RegEx吗?

仅供参考,我正在使用.Net 3.5的RegEX引擎(通过C#)

非常感谢

Tim*_*ker 7

好的,完成重新编辑以确认新的"规范":)

我很确定你不能用一个正则表达式做到这一点.最好的工具肯定是HTML解析器.我能用正则表达式得到的最接近的是两步法.

首先,用以下内容隔离每个段落的内容:

<p>(.*?)</p>
Run Code Online (Sandbox Code Playgroud)

您需要设置RegexOptions.Singleline段落是否可以跨越多行.

然后,在下一步中,迭代您的匹配并在每个匹配上应用以下正则表达式Group[1].Value:

((?:(\S+\s+){1,6})\w+)
Run Code Online (Sandbox Code Playgroud)

这将匹配由空格/制表符/换行符分隔的前七个项目,忽略任何尾随标点符号或非单词字符.

但它会将由空格分隔的标签视为其中一个项目,即在

One, two three <br\> four five six seven
Run Code Online (Sandbox Code Playgroud)

它只会匹配到six.我想那是正则表达式,没有办法解决这个问题.