gpt4 book ai didi

regex - 如何在 VBA 中使用 RegExp 隔离空格(\s 与\p{Zs})?

转载 作者:行者123 更新时间:2023-12-03 01:01:12 24 4
gpt4 key购买 nike

介绍/问题:

我一直在研究正则表达式的使用(使用VBA/Excel),到目前为止我无法理解如何隔离 <space> (或 " " )使用 \s 中包含的其他空白字符的正则表达式。我以为我可以使用\p{Zs} ,但到目前为止,在我的测试中,它还没有成功。有人可以纠正我的误解吗?我感谢任何有用的意见。

为了提供适当的信用,我修改了一些代码,这些代码最初是@Portland Runner 的一篇非常有用的帖子,可以在此处找到:How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops

到目前为止,这是我的方法/研究:

使用字符串"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

这种方法给我的 A1 值为 " Flavored Peanuts" (注意该字符串中的前导 <space>)

然后我改变了strPattern = "^[0-9](\S)+(\s)" (添加 (\s) ),这给了我所需的 A1 值 "Flavored Peanuts" 。伟大的!!!我得到了想要的输出!

但据我了解,\s表示所有空白字符,等于 [ \f\n\r\t\v] 。在这种情况下,我知道该字符只是一个普通的单个空格 - 我不需要回车符、水平制表符等。所以我尝试看看是否可以隔离 <space>正则表达式中的字符(unicode分隔符:空格),我相信是 \p{Zs} (例如 strPattern = "^[0-9](\S)+(\p{Zs})" )。但是,使用此模式不会返回任何匹配项,更不用说删除前导空格。我还尝试了更通用的\p{Z} (所有 unicode 分隔符),但这也不起作用。

显然我在学习中遗漏了一些东西。需要并感谢帮助。谢谢。

最佳答案

由于您正在尝试查找与 \p{Zs} Unicode 类别类的对应关系,因此您可能还需要处理所有硬空间。这段代码会很有帮助:

strPattern = "^[0-9](\S)+[ " & ChrW(160) & "]"

或者,

strPattern = "^[0-9](\S+)[ \x0A]"

[\x0A] 字符类将匹配常规空格或硬不间断空格

如果您需要匹配各种空格,您可以使用根据 https://www.cs.tut.fi/~jkorpela/chars/spaces.html 上的信息获取的正则表达式模式。 :

strPattern = "^[0-9](\S)+[ \xA0\u1680\u180E\u2000-\u200B\u202F\u205F\u3000\uFEFF]"

这是带有代码点说明的表格:

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 foo᠎bar 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 foo​bar 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

致以诚挚的问候。

关于regex - 如何在 VBA 中使用 RegExp 隔离空格(\s 与\p{Zs})?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28617616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com