在 LibreOffice Calc 中提取正则表达式的命名组

在 LibreOffice Calc 中提取正则表达式的命名组

在 Python 3 中,从命名组中提取文本非常容易,如以下示例所示:

import re
myStr = r"4000/2000/5000/7000"
reObj = re.compile(r"""(?P<g1>\d+)  # a capturing group named g1
                       /
                       (?P<g2>\d+)
                       /
                       (?P<g3>\d+)
                       /
                       (?P<g4>\d+)""", re.VERBOSE) 
matchObj = reObj.match(myStr)  # match the string to be searched
print(matchObj.group("g1"))  # 4000
print(matchObj.group("g2"))  # 2000 
print(matchObj.group("g3"))  # 5000 
print(matchObj.group("g4"))  # 7000

然而,在 LibreOffice Calc 中,我根本找不到任何线索(Calc 甚至没有独立的 regex() 函数来提供正则表达式模式)。基于位置的解决方法如下这个帖子不是我需要的。

请给出与位置参数无关的答案,并请明确举例说明。例如,MID() 是不可接受的。虽然这里给出的例子足够简单,但我需要一种通用的方法来处理远为复杂的实际情况。

答案1

在 Excel 和 Calc 中,最简洁的解决方案是创建通用正则表达式宏。要在 Calc 中执行此操作,请转到Tools -> Macros -> Organize Macros -> LibreOffice BasicModule1 并将以下代码添加到:

Function ReFind(findIn, patt, Optional group_param As Integer,  _
                Optional ignoreCase_param As Boolean)
    ' findIn - string or cell to search in
    ' patt - regexp string or cell containing regexp string
    ' group - which group to grab - analogy to \n in regexp syntax
    ' ignoreCase - false for case sensitive matches
    If IsMissing (group_param) Then
        group = 0
    Else
        group = group_param
    End If
    If IsMissing (ignoreCase_param) Then
        ignoreCase = False
    Else
        ignoreCase = ignoreCase_param
    End If
    oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")
    oOptions = CreateUnoStruct("com.sun.star.util.SearchOptions")
    oOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
    If ignoreCase Then
        oOptions.transliterateFlags = _
            com.sun.star.i18n.TransliterationModules.IGNORE_CASE
    End If
    oOptions.searchString = patt
    oTextSearch.setOptions(oOptions)
    oFound = oTextSearch.searchForward(findIn, 0, Len(findIn))
    If oFound.subRegExpressions = 0 Then
        ReFind = "No results"
        MsgBox "No results"
        Exit Function
    ElseIf group >= oFound.subRegExpressions Then 
         ReFind = "No result for that group"
         MsgBox "No result for that group"
         Exit Function
    Else
         nStart = oFound.startOffset()
         nEnd = oFound.endOffset()
         ReFind = Mid(findIn, nStart(group) + 1, nEnd(group) - nStart(group))
    End If
End Function

现在,您可以ReFind在电子表格中使用所需的任何正则表达式。例如,在单元格 A1 中输入12345。在单元格 B1 中,输入公式=REFIND($A$1,"(\d\d)(\d)",2)。这将检索第三个数字,即 3。

代码改编自https://forum.openoffice.org/en/forum/viewtopic.php?t=30502

注意:最好使用 Python 或 Java 创建正则表达式加入。然而,这需要扩展中的 XML 声明文件,这需要更多时间来设置。

答案2

据我所知,你不能在 LO Calc 搜索/替换或公式中使用命名组,但你可以使用数字参考到模式组:

  • 在里面搜索字段,您可以用来\1引用第一个模式组、\2第二个模式组等等。
  • 在里面代替表达式,$1作为第一个搜索模式组的参考,$2作为第二个搜索模式组的参考,依此类推。

搜索示例

假设有四个字符串blue bluefishblack blackfishblue blackfishblack bluefish您可以使用搜索模式替换每个出现两次相同颜色的字符串(字符串 1 和 2):。(blue|black) \1fish将引用匹配组,仅当正则表达式组中匹配的颜色也出现在之前时才\1匹配整个字符串。((blue|black)fish基于 OOo Wiki 文档的示例)。

替换示例

要将字符串转换100/200/300/400300/100/400/200(在搜索选项中启用正则表达式),请搜索模式(\d+)/(\d+)/(\d+)/(\d+)并替换为$3/$1/$4/$2

相关内容