使用正则表达式将编号列表数组拆分为编号列表多行

时间:2017-09-20 20:50:28

标签: regex excel-vba vba excel

我正在努力学习正则表达式来回答关于SO葡萄牙语的问题。

输入(单元格上的数组或字符串,所以.MultiLine = False)?

 1 One without dot. 2. Some Random String. 3.1 With SubItens. 3.2 With number 0n mid. 4. Number 9 incorrect. 11.12 More than one digit. 12.7 Ending (no word).

输出

 1 One without dot.
 2. Some Random String.
 3.1 With SubItens.
 3.2 With number 0n mid.
 4. Number 9 incorrect.
 11.12 More than one digit.
 12.7 Ending (no word).

我的想法是使用Regex with Split,但我无法在Excel上实现该示例。

Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim input As String = "plum-pear"
      Dim pattern As String = "(-)" 

      Dim substrings() As String = Regex.Split(input, pattern)    ' Split on hyphens.
      For Each match As String In substrings
         Console.WriteLine("'{0}'", match)
      Next
   End Sub
End Module
' The method writes the following to the console:
'    'plum'
'    '-'
'    'pear' 

阅读thisthisRegExr Website与输入中的表达式/([0-9]{1,2})([.]{0,1})([0-9]{0,2})/igm一起使用。

获得以下内容:

RegExr

有更好的方法吗?正则表达式是正确还是更好的生成方式?我在谷歌上找到的例子没有让我了解如何正确使用RegEx与Split。

也许我对Split Function的逻辑感到困惑,我想得到拆分索引,而分隔符字符串是正则表达式。

2 个答案:

答案 0 :(得分:1)

  

我可以说它以单词和句号结尾

使用

\d+(?:\.\d+)*[\s\S]*?\w+\.

请参阅regex demo

<强>详情

  • \d+ - 一位或多位
  • (?:\.\d+)* - 零个或多个序列:
    • \. - dot
    • \d+ - 一位或多位
  • [\s\S]*? - 任意0个字符,尽可能少,直到第一个......
  • \w+\. - 1个单词字符后跟.

以下是VBA代码示例:

Dim str As String
Dim objMatches As Object
str = " 1 One without dot. 2. Some Random String. 3.1 With SubItens. 3.2 With Another SubItem. 4. List item. 11.12 More than one digit."
Set objRegExp = New regexp ' CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\d+(?:\.\d+)*[\s\S]*?\w+\."
objRegExp.Global = True
Set objMatches = objRegExp.Execute(str)
If objMatches.Count <> 0 Then
  For Each m In objMatches
      Debug.Print m.Value
  Next
End If

enter image description here

注意

您可能要求匹配仅停留在+ .后面,后跟0 +空格和使用\d+(?:\.\d+)*[\s\S]*?[a-zA-Z]+\.(?=\s*(?:\d+|$))的数字。

(?=\s*(?:\d+|$))正向前瞻要求存在0+空格(\s*),后跟1+位数(\d+)或字符串结尾($)当前位置的权利。

答案 1 :(得分:0)

如果VBA的拆分支持后视式正则表达式,那么这个可以正常工作,假设除了索引之外没有数字:

    \s(?=\d)