我想在句子中查找像 DOI 这样的字符串,并在单元格中提取结果。我在 LibreOffice Calc(当前版本 6.2.4.2)中找到了 »regex« 函数,它告诉我它可以完全按照我的要求执行。
例子:
Foo bar doi: 10.1016/j.cmpb.2018.09.006 baar foooo
我在 python 中的正则表达式是:
\b(10[.][0-9]{4,}(?:[.][0-9]+)*\/(?:(?![\"&\'<>])\S)+)\b
并且在 python 脚本中非常适合我(它完全匹配 doi 编号,而不需要 »doi« 字符串,这是有意为之)。
但是 »regex« 函数拒绝了这个正则表达式。文档中提到了 ICU 正则表达式,与我的正则表达式相比,我没有发现任何问题。
我是否遗漏了什么?哪种 »regex 方言« 适用于 LibreOffice?
答案1
在列表中常用表达LibreOffice 支持大多数标准表达式,但缺少您使用的两个元素:
- 用于
?:
非捕获组; 用于
?!
负面前瞻。1 1 2 | | | v v v \b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?!["&'<>])\S)+)\b
我不知道这代表什么级别的 RE(它似乎是带有附加功能的 BRE),但这意味着你的 RE 将与你的测试字符串不匹配。
目前尚不清楚您的字符串中有多少构成了您要隔离的数字,因此我无法建议您如何避免不受支持的元素,但有以下几种可能性:-
doi:
如果您需要和之间的数字字符串/
,那么更简单的\b10[.][0-9]{4,}(?:[.][0-9]+)*
就足够了。- 如果您需要
doi:
和下一个空格之间的所有内容,那么您可以使用\b10[.][0-9]{4,}(?:[.][0-9]+)*[^\s]*
。
(第二种情况与你的 RE 相同正则表达式。
我意识到您的实时数据可能存在更多必须捕获的异常,但如果不完全了解您的数据和您尝试匹配的数字,我就无法做更多的事情。