代码之家  ›  专栏  ›  技术社区  ›  menteith

RegEx到Word中的新行字符不多

  •  1
  • menteith  · 技术社区  · 9 年前

    我有这样的字符串:

    1. 约翰·史密斯(1919-2006)。
    2. Vicky McKane(1949-2012)。

    我想匹配

    7. 史密斯,约翰 (1919-2006).

    8. 维姬·麦肯 (1949-2012).

    我想出了这个 \s*[0-9]\.\s*|\s*(?:\([^()]*\))\.\s* link 。它可以做到这一点,但也可以捕获新行字符,当正则表达式被替换为空字符时,新行字符会在MS Word中给出以下字符串 "" :

    史密斯、乔姆麦肯、维基

    编辑: 下面是我使用的VBA代码:

    With selection
            Dim RegEx As Object
            Set RegEx = CreateObject("VBScript.RegExp")
            RegEx.Global = True
            RegEx.MultiLine = True
            RegEx.Pattern = "\s*[0-9]\.\s*|\s*(?:\([^()]*\))\.\s*"
            .Text = RegEx.Replace(.Text, "")
    End With
    
    2 回复  |  直到 5 年前
        1
  •  1
  •   Wiktor Stribiżew    9 年前

    我对它进行了很多测试,我能达到的最好成绩是

    [ \t]*[0-9]\.[ \t]*|[ \t]*(?:\([^()]*\))\.[ \t]*
    

    或者-由于启用了“多行”选项:

    ^[ \t]*[0-9]\.[ \t]*|[ \t]*(?:\([^()" & vbCr & vbLf & "]*\))\.[ \t]*$
    

    两者都将导致

    Smith, John
    McKane, Vicky
    

    请注意 \s 可以安全地替换为 [ \t] 仅匹配ASCII常规水平空白。

    最后一段分隔符尽可能添加 仅当在替换之前选择了全部内容时 。如果选择除最后一个分隔符之外的所有分隔符,则不会插入其他分隔符。

    因此,您可以使用以下解决方法:

    ActiveDocument.Content.Select
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    With Selection
            Dim RegEx As Object
            Set RegEx = CreateObject("VBScript.RegExp")
            RegEx.Global = True
            RegEx.MultiLine = True
            RegEx.Pattern = "^[ \t]*[0-9]\.[ \t]*|[ \t]*(?:\([^()" & vbCr & vbLf & "]*\))\.[ \t]*$"
            .Text = RegEx.Replace(.Text, "")
    End With
    

    enter image description here

        2
  •  0
  •   dustinroepsch    9 年前

    [^\S\n]

    将匹配任何非新行的空白

    /\s*[0-9]\.\s*|\s*(?:\([^()]*\))\.[^\S\n]*/g
    

    然而,我会建议另一种方法来做你想做的事情。

    /\d\.\s(.*)\s\(.*\)\./g
    

    将与您所要求的行匹配,但将名称放入“捕获组”以便于以后检索。