c# - 需要 RegEx 返回第一段或前 n 个词

标签 c# regex

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

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

<p>one two <tag>three</tag> four five, six seven eight nine ten.</p><p>ignore</p>

我会得到:

one two <tag>three</tag> four five, six seven

并且在包含少于请求的单词数的段落上使用相同的正则表达式:

<p>one two <tag>three</tag> four five.</p><p>ignore</p>

只会返回:

one two <tag>three</tag> four five.

我对这个问题的尝试导致了以下 RegEx:

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

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

我哪里错了?任何人都可以提供一个可行的 RegEx 吗?

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

非常感谢

最佳答案

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

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

首先,将每个段落的内容隔离开来:

<p>(.*?)</p>

如果段落可以跨多行,则需要设置 RegexOptions.Singleline

然后,在下一步中,遍历您的匹配项并对每个匹配项的 Group[1].Value 应用以下正则表达式一次:

((?:(\S+\s+){1,6})\w+)

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

但它会将以空格分隔的标签视为其中一项,即。 e.在

One, two three <br\> four five six seven

它只会匹配到 6。我想就正则表达式而言,没有办法解决这个问题。

关于c# - 需要 RegEx 返回第一段或前 n 个词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/834256/

相关文章:

java - 正则表达式获取@符号后的字符串

regex - [Perl] : Read directory and files, 和正则表达式

regex - 在Sublime Text 3中使用正则表达式替换

c# - 不同泛型类型的集合

c# - 从 OperationContext 获取 SOAP header 中的值

c# - JsonValue 和 JsonObject 有什么区别?

C# 自定义 EventArgs 问题

sql - Bigquery regexp_replace 错误 (\? vs\\?)

c# - 在 Windows 7 中使用 C# 运行 Selenium 测试时出现 "IEDriverServer does not exist"错误

r - 如何删除R中的特定特殊字符