Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Excel表格中以回车符为基础拆分文本,显示不同方法的不同行为_Regex_Vbscript - Fatal编程技术网

Regex 在Excel表格中以回车符为基础拆分文本,显示不同方法的不同行为

Regex 在Excel表格中以回车符为基础拆分文本,显示不同方法的不同行为,regex,vbscript,Regex,Vbscript,有一张excel表格,其中单元格的数据如下所示 第1单元: 简介和基本措辞 1, 3. A步骤1和3 -子步骤1,共1步。 -第2步,共1步 … 2.步骤2。 -第1步,共2步 四,六。步骤4和步骤6 5.A步骤5 注意:很少有步骤在结尾处有句号(“.”) 应为-希望根据步骤(而不是子步骤)拆分文本。介绍和基本措辞应与Cell1一起提供 第1单元- 简介和基本措辞 1, 3. A步骤1和3 -子步骤1,共1步。 -第2步,共1步 细胞2- A第2步。 第1步,共1步 细胞3- 四,六。A步骤

有一张excel表格,其中单元格的数据如下所示

第1单元:

简介和基本措辞
1, 3. A步骤1和3
-子步骤1,共1步。
-第2步,共1步

2.步骤2。
-第1步,共2步

四,六。步骤4和步骤6
5.A步骤5

注意:很少有步骤在结尾处有句号(“.”)

应为-希望根据步骤(而不是子步骤)拆分文本。介绍和基本措辞应与Cell1一起提供

第1单元-

简介和基本措辞
1, 3. A步骤1和3
-子步骤1,共1步。
-第2步,共1步

细胞2-

  • A第2步。
    • 第1步,共1步
  • 细胞3-

    四,六。A步骤3和6

    第四单元

  • A步骤5
  • 下面是给我不同结果的方法

    方法1:使用Crriage返回(Chr(10))

    结果:0匹配

    方法3:在句号(“.”)上使用正则表达式拆分

    结果

    第1单元:

    一,三。A步骤1和3
    -A第1步,共1步。 …
    第2单元:

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

    "(?:^[\s\S]?|[\r\n])(\d+(?:, *\d+)?\.[\s\S]*?)(?=[\r\n]+\d+(?:, *\d+)?\.[\s\S]*|$)"
    
    结果: 不包括步骤1之前的前置文本

    您可以使用

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

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

    图案细节

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

    试试正则表达式(
    .Global=True
    .Multiline=False
    ,access
    .Submatches(1)
    )。感谢Wiktor提供宝贵的意见和逐步解释答案。这对我有用。。我在给定代码中所做的唯一更改是“.Value”而不是“.Submatches(1)”,因为在VBscript编辑器中执行时,它会将错误作为异常给出:无效的过程调用或参数。关于Submatches的一点意味着您需要的值被捕获到组1中,并且必须通过Submatches访问。这对于使用Submatches是正确的。但在这里,您的代码不需要明确地告诉组1,因为组0是非捕获组,组2是正向前瞻组。非捕获组仍然使用换行符。我同意您可以在
    .Value
    上使用
    Trim()
    。谢谢。我在.Value上使用的那个,以获得正确的结果。
    re.Pattern = "^\d[\.]?[, \d\.]? ([\s\S]*?)\.$"  
    
    "(?:^[\s\S]?|[\r\n])(\d+(?:, *\d+)?\.[\s\S]*?)(?=[\r\n]+\d+(?:, *\d+)?\.[\s\S]*|$)"
    
    (?:^|[\r\n])(\d+(?‌​:, *\d+)?\.[\s\S]*?)(?=‌​\n\d+(?:, *\d+)?\.|$)