在Excel工作表中基于Carriage返回拆分文本,显示不同方法的不同行为

时间:2016-08-16 05:16:33

标签: regex vbscript

使用包含下面给出数据的单元格的Excel工作表

小区1:

  

简介和基本措辞
  1,3步骤1和3
   - 1的子步骤1    - 1的子步骤2   ...
  2.步骤2.
   - 子步骤1 of 2

     

4,6。步骤4和6
  5.第5步

注意:几个步骤已完全停止("。")结束

预期 - 希望根据步骤拆分文本(而非基于子步骤)。引言和基本措辞应与Cell1一起出现

小区1 -

  

简介和基本措辞
  1,3步骤1和3
   - 1的子步骤1    - 1的子步骤2 ......

Cell2-

  
      
  1. 第2步。      
        
    • 子步骤1的1
    •   
  2.   

Cell3-

  

4,6。步骤3和6

cell4

  
      
  1. 第5步
  2.   

以下是给我不同结果的方法

方法1 :使用Crriage return(Chr(10))

If InStr(1, str, Chr(10)) <> 0 Then
   arrVars = Split(str, Chr(10))
...
End If  

结果:拆分下面的每个文字

小区1:

  

1,3。步骤1和3

Cell2:

  
      
  • 1的子步骤1。
  •   

Cell3:

  

...

方法2 :使用正则表达式

re.Pattern = "^\d[\.]?[, \d\.]? ([\s\S]*?)\r$"  
Set oCol = re.Execute(str)  
For Each sMtch In oCol  
  sStep = Trim(sMtch.SubMatches(0))  
...  
Next  

结果: 0匹配

方法3 :在全站点上使用正则表达式拆分(&#34;。&#34;)

re.Pattern = "^\d[\.]?[, \d\.]? ([\s\S]*?)\.$"  

结果

Cell1:

  

1,3。步骤1和3
   - 1的子步骤1。   ...
  Cell2:

方法4 :使用正则表达式在第一步之前包含前置文本

"(?:^[\s\S]?|[\r\n])(\d+(?:, *\d+)?\.[\s\S]*?)(?=[\r\n]+\d+(?:, *\d+)?\.[\s\S]*|$)"

结果: 不包括前一步到第一步的前文本

1 个答案:

答案 0 :(得分:1)

您可以使用

(?:^|[\r\n])(\d+(?‌​:, *\d+)?\.[\s\S]*?)(?=‌​\n\d+(?:, *\d+)?\.|$)

请参阅regex demo

确保您使用.Global = True.Multiline = False并访问.Submatches(1)(第一个捕获组的内容)。

模式详情

  • (?:^|[\r\n]+) - 一个非捕获组,有两个选项,可以是字符串或换行符的开头
  • (\d+(?‌​:, *\d+)?\.[\s\S]*?) - 第1组捕获:
    • \d+ - 一位或多位
    • (?‌​:, *\d+)? - 可选序列:,,后跟0 +空格和1+位数
    • \.[\s\S]*? - 一个点(\.)然后0+任何字符,尽可能少
  • (?=‌[\r​\n]+\d+(?:, *\d+)?\.|$) - 需要字符串$或结尾的正向前瞻
    • [\r\n]+ - 换行符(1个或多个CR或LF符号)
    • \d+ - 一位或多位
    • (?:, *\d+)? - 见上文
    • \. - 一个点。