我正在寻找一个 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/