【发布时间】:2021-06-13 04:22:00
【问题描述】:
我的文本块仅包含 一个 特定的 HTML 标记(即“标记”标记),我想提取包含该标记的所有连续“句子”的一段。我的用例中的“句子”由问号、感叹号、句号或分号分隔。
编辑:“标记”标签是在服务器端自动生成的,它们总是格式正确的。在我的用例中没有召唤克苏鲁的风险。
我尝试过的:
从this PCRE regex 中的第二个结果开始,它适用于选择所有包含单词“flung”的句子,例如 this regex tester。我添加了分号,因为它们也在我的用例中:
/[^.;?!]*(?<=[.;?\s!])flung(?=[\s.;?!])[^.;?!]*[.;?!]/igm
这很好用,除了两个我仍然需要帮助的问题:
-
如何排除十进制数字,例如12.34 比赛期间? “Lorem ipsum 12.34 dolor flung sat amet”应该是一句话。目前,它将十进制数字中的句点作为标点符号,但事实并非如此。我想修改 REGEX 以检测小数点周围是否有数字或字母会起作用,但我尝试了诸如
?:[^\.]|\.(?=\d)之类的前瞻约束,但它不匹配,或者我没有这样做对。 -
我想修改它以匹配所有“标记”HTML 标记,而不是诸如“flung”之类的词。我知道 REGEX 不适合 html 标记,但是 HTML 解析器也无法识别这些字符(?!。;)。也许我可以考虑将两者结合起来?
我的期望:
示例 1:(基本匹配)
harum quidem rerum facilis est et expedita distinctio? Nam libero tempore, cum soluta nobis est eligendi optio <mark>cumque</mark> nihil impedit .23 quo minus id 0.89 quod maxime placeat facere possimus, omnis voluptas assumenda est, 12.34 omnis dolor repellendus! Itaque earum rerum hic tenetur a sapiente delectus, quod maxime placeat
应该返回
Nam libero tempore, cum soluta nobis est eligendi optio <mark>cumque</mark> nihil impedit .23 quo minus id 0.89 quod maxime placeat facere possimus, omnis voluptas assumenda est, 12.34 omnis dolor repellendus!
因为那是包含“mark”标签的句子,小数点不是句号。
示例2(任何不包含标签但介于其他标签句子之间的句子也将包括在内。)
At vero eos et accusamus et iusto odio dignissimos ducimus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do <mark>eiusmod</mark> tempor incididunt ut labore et dolore <mark>magna</mark> aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea <mark>commodo</mark> consequat? Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur! Excepteur sint <mark>occaecat</mark> cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum; sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam?
应该返回以下内容(请注意句子“Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur!”即使它没有标签,也被包括在内,因为它位于其他两个匹配的句子之间)。
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do <mark>eiusmod</mark> tempor incididunt ut labore et dolore <mark>magna</mark> aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea <mark>commodo</mark> consequat? Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur! Excepteur sint <mark>occaecat</mark> cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
【问题讨论】: