RegEx中Word中的新行字符不多

时间:2016-02-04 13:56:36

标签: regex vba ms-word

我有这样的字符串:

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

我想匹配

  

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

     

8. McKane,Vicky (1949-2012).

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

  史密斯,JohmMcKane,Vicky

编辑:以下是我使用的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 个答案:

答案 0 :(得分:1)

我已经测试了很多,我能做到的最好的是

[ \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

答案 1 :(得分:0)

  

[^ \ S \ n]的

将匹配任何不是新行的空白

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

但是,我会建议另一种方法来做你想做的事。

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

会匹配您提出的问题,但会将这些名称放入捕获组,以便以后轻松检索。