如何在 VBA(\s 与 \p{Zs})中使用 RegExp 隔离 space?
How do I isolate a space using RegExp in VBA (\s vs. \p{Zs})?
Introduction/Question:
我一直在研究正则表达式的使用(使用 VBA/Excel),到目前为止我不明白如何使用正则表达式从中分离出 <space>
(或 " "
) \s
中包含的其他白色 space 字符。我以为我可以使用 \p{Zs}
,但到目前为止,在我的测试中,它还没有成功。有人可以纠正我的误解吗?我感谢任何有用的输入。
为了提供适当的信用,我修改了一些代码,这些代码开始时非常有用 post @Portland Runner 可在此处找到:How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops
到目前为止,这是我的approach/study:
使用字符串 "14z-16z Flavored Peanuts"
,我一直在尝试编写一个 RegExp,它删除 "14z-16z "
并只留下 "Flavored Peanuts"
。我最初使用 ^[0-9](\S)+
作为 strPattern 和一个包含以下片段的子过程:
Sub REGEXP_TEST_SPACE()
Dim strPattern As String
Dim strReplace As String
Dim strInput As String
Dim regEx As New RegExp
strInput = "14z-16z Flavored Peanuts"
strPattern = "^[0-9](\S)+"
strReplace = ""
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = True
.pattern = strPattern
End With
If regEx.Test(strInput) Then
Range("A1").Value = regEx.Replace(strInput, strReplace)
End If
End Sub
这种方法给了我 " Flavored Peanuts"
的 A1 值(注意该字符串中的前导 <space>
)。
然后我更改了 strPattern = "^[0-9](\S)+(\s)"
(添加了 (\s)
),这给了我想要的 "Flavored Peanuts"
的 A1 值。伟大的!!!我得到了想要的输出!
不过据我理解,\s
代表所有白色-space字符,等于[ \f\n\r\t\v]
。在这种情况下,我知道这个字符只是一个普通的、单一的 space——我不需要回车 return、水平制表符等。所以我试着看看是否可以隔离<space>
正则表达式中的字符(unicode 分隔符:space),我认为是 \p{Zs}
(例如 strPattern = "^[0-9](\S)+(\p{Zs})"
)。然而,使用这种模式,无论如何 return 都不会匹配,更不用说删除前导 space。我还尝试了更通用的 \p{Z}
(所有 unicode 分隔符),但这也不起作用。
显然我在学习中遗漏了一些东西。帮助既是需要的也是感激的。谢谢。
您可以在您的 RegEx 模式中明确包含白色 space。以下模式工作得很好
strPattern = "^[0-9](\S)+ "
只需使用文字 space 字符:strPattern = "^[0-9](\S)+ "
.
由于您正在尝试查找与 \p{Zs}
Unicode 类别 class 的对应关系,因此您可能还想处理所有困难的 space。此代码会有所帮助:
strPattern = "^[0-9](\S)+[ " & ChrW(160) & "]"
或者,
strPattern = "^[0-9](\S+)[ \x0A]"
[ \x0A]
字符 class 将匹配常规的 space 或硬的、不间断的 space。
如果你需要匹配各种spaces,你可以使用根据https://www.cs.tut.fi/~jkorpela/chars/spaces.html上的信息获取的这个正则表达式模式:
strPattern = "^[0-9](\S)+[ \xA0\u1680\u180E\u2000-\u200B\u202F\u205F\u3000\uFEFF]"
这是 table 代码点解释:
U+0020 32 SPACE foo bar Depends on font, typically 1/4 em, often adjusted
U+00A0 160 NO-BREAK SPACE foo bar As a space, but often not adjusted
U+1680 5760 OGHAM SPACE MARK foo bar Unspecified; usually not really a space but a dash
U+180E 6158 MONGOLIAN VOWEL SEPARATOR foobar No width
U+2000 8192 EN QUAD foo bar 1 en (= 1/2 em)
U+2001 8193 EM QUAD foo bar 1 em (nominally, the height of the font)
U+2002 8194 EN SPACE foo bar 1 en (= 1/2 em)
U+2003 8195 EM SPACE foo bar 1 em
U+2004 8196 THREE-PER-EM SPACE foo bar 1/3 em
U+2005 8197 FOUR-PER-EM SPACE foo bar 1/4 em
U+2006 8198 SIX-PER-EM SPACE foo bar 1/6 em
U+2007 8199 FIGURE SPACE foo bar “Tabular width”, the width of digits
U+2008 8200 PUNCTUATION SPACE foo bar The width of a period “.”
U+2009 8201 THIN SPACE foo bar 1/5 em (or sometimes 1/6 em)
U+200A 8202 HAIR SPACE foo bar Narrower than THIN SPACE
U+200B 8203 ZERO WIDTH SPACE foobar Nominally no width, but may expand
U+202F 8239 NARROW NO-BREAK SPACE foo bar Narrower than NO-BREAK SPACE (or SPACE)
U+205F 8287 MEDIUM MATHEMATICAL SPACE foo bar 4/18 em
U+3000 12288 IDEOGRAPHIC SPACE foo bar The width of ideographic (CJK) characters.
U+FEFF 65279 ZERO WIDTH NO-BREAK SPACE
此致。
Introduction/Question:
我一直在研究正则表达式的使用(使用 VBA/Excel),到目前为止我不明白如何使用正则表达式从中分离出 <space>
(或 " "
) \s
中包含的其他白色 space 字符。我以为我可以使用 \p{Zs}
,但到目前为止,在我的测试中,它还没有成功。有人可以纠正我的误解吗?我感谢任何有用的输入。
为了提供适当的信用,我修改了一些代码,这些代码开始时非常有用 post @Portland Runner 可在此处找到:How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops
到目前为止,这是我的approach/study:
使用字符串 "14z-16z Flavored Peanuts"
,我一直在尝试编写一个 RegExp,它删除 "14z-16z "
并只留下 "Flavored Peanuts"
。我最初使用 ^[0-9](\S)+
作为 strPattern 和一个包含以下片段的子过程:
Sub REGEXP_TEST_SPACE()
Dim strPattern As String
Dim strReplace As String
Dim strInput As String
Dim regEx As New RegExp
strInput = "14z-16z Flavored Peanuts"
strPattern = "^[0-9](\S)+"
strReplace = ""
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = True
.pattern = strPattern
End With
If regEx.Test(strInput) Then
Range("A1").Value = regEx.Replace(strInput, strReplace)
End If
End Sub
这种方法给了我 " Flavored Peanuts"
的 A1 值(注意该字符串中的前导 <space>
)。
然后我更改了 strPattern = "^[0-9](\S)+(\s)"
(添加了 (\s)
),这给了我想要的 "Flavored Peanuts"
的 A1 值。伟大的!!!我得到了想要的输出!
不过据我理解,\s
代表所有白色-space字符,等于[ \f\n\r\t\v]
。在这种情况下,我知道这个字符只是一个普通的、单一的 space——我不需要回车 return、水平制表符等。所以我试着看看是否可以隔离<space>
正则表达式中的字符(unicode 分隔符:space),我认为是 \p{Zs}
(例如 strPattern = "^[0-9](\S)+(\p{Zs})"
)。然而,使用这种模式,无论如何 return 都不会匹配,更不用说删除前导 space。我还尝试了更通用的 \p{Z}
(所有 unicode 分隔符),但这也不起作用。
显然我在学习中遗漏了一些东西。帮助既是需要的也是感激的。谢谢。
您可以在您的 RegEx 模式中明确包含白色 space。以下模式工作得很好
strPattern = "^[0-9](\S)+ "
只需使用文字 space 字符:strPattern = "^[0-9](\S)+ "
.
由于您正在尝试查找与 \p{Zs}
Unicode 类别 class 的对应关系,因此您可能还想处理所有困难的 space。此代码会有所帮助:
strPattern = "^[0-9](\S)+[ " & ChrW(160) & "]"
或者,
strPattern = "^[0-9](\S+)[ \x0A]"
[ \x0A]
字符 class 将匹配常规的 space 或硬的、不间断的 space。
如果你需要匹配各种spaces,你可以使用根据https://www.cs.tut.fi/~jkorpela/chars/spaces.html上的信息获取的这个正则表达式模式:
strPattern = "^[0-9](\S)+[ \xA0\u1680\u180E\u2000-\u200B\u202F\u205F\u3000\uFEFF]"
这是 table 代码点解释:
U+0020 32 SPACE foo bar Depends on font, typically 1/4 em, often adjusted
U+00A0 160 NO-BREAK SPACE foo bar As a space, but often not adjusted
U+1680 5760 OGHAM SPACE MARK foo bar Unspecified; usually not really a space but a dash
U+180E 6158 MONGOLIAN VOWEL SEPARATOR foobar No width
U+2000 8192 EN QUAD foo bar 1 en (= 1/2 em)
U+2001 8193 EM QUAD foo bar 1 em (nominally, the height of the font)
U+2002 8194 EN SPACE foo bar 1 en (= 1/2 em)
U+2003 8195 EM SPACE foo bar 1 em
U+2004 8196 THREE-PER-EM SPACE foo bar 1/3 em
U+2005 8197 FOUR-PER-EM SPACE foo bar 1/4 em
U+2006 8198 SIX-PER-EM SPACE foo bar 1/6 em
U+2007 8199 FIGURE SPACE foo bar “Tabular width”, the width of digits
U+2008 8200 PUNCTUATION SPACE foo bar The width of a period “.”
U+2009 8201 THIN SPACE foo bar 1/5 em (or sometimes 1/6 em)
U+200A 8202 HAIR SPACE foo bar Narrower than THIN SPACE
U+200B 8203 ZERO WIDTH SPACE foobar Nominally no width, but may expand
U+202F 8239 NARROW NO-BREAK SPACE foo bar Narrower than NO-BREAK SPACE (or SPACE)
U+205F 8287 MEDIUM MATHEMATICAL SPACE foo bar 4/18 em
U+3000 12288 IDEOGRAPHIC SPACE foo bar The width of ideographic (CJK) characters.
U+FEFF 65279 ZERO WIDTH NO-BREAK SPACE
此致。