Regex 在Excel表格中以回车符为基础拆分文本,显示不同方法的不同行为
有一张excel表格,其中单元格的数据如下所示 第1单元: 简介和基本措辞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步骤
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-
- 第1步,共1步
-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]+)
-第1组捕获:(\d+(?)?:, *\d+?\.[\s\s]*?)
-1个或多个数字\d+
-可选序列:(?:, *\d+?
,后跟0+空格和1+数字,
-一个点(\.[\s\s]*?
),然后0+任何字符,尽可能少\.
-需要字符串结尾的正向前瞻(=[\r]\n] +\d+(?:,*\d+?\。$)
或$
-换行符(1个或多个CR或LF符号)[\r\n]+
-1个或多个数字\d+
-见上文(?:,*\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+)?\.|$)