Regex 任何单词只包含字母、数字、下划线和句点

Regex 任何单词只包含字母、数字、下划线和句点,regex,vba,Regex,Vba,我想在VBA中为like函数编写一个模式,以验证任何只包含字母、数字、下划线和句点的单词 我可以像[A-Za-z0-9.]那样写一个字符。但是[A-Za-z0-9_,]+似乎没有检查一个单词。有人能帮忙吗?你说得很清楚,你只想用比如,在这里,哪一个不是你最好的选择。最好的方法是使用Regex(正如您自己标记的那样)。但是不要混淆两者,因为没有像+这样的修饰符。您必须为每个字符指定模式。因此,您需要的不是非常方便的[A-Za-z0-9,]+,而是类似于:[A-Za-z0-9,][A-Za-z0-9

我想在VBA中为
like
函数编写一个模式,以验证任何只包含字母、数字、下划线和句点的单词


我可以像
[A-Za-z0-9.]
那样写一个字符。但是
[A-Za-z0-9_,]+
似乎没有检查一个单词。有人能帮忙吗?

你说得很清楚,你只想用
比如
,在这里,哪一个不是你最好的选择。最好的方法是使用
Regex
(正如您自己标记的那样)。但是不要混淆两者,因为没有像
+
这样的修饰符。您必须为每个
字符指定模式。因此,您需要的不是非常方便的
[A-Za-z0-9,]+
,而是类似于:
[A-Za-z0-9,][A-Za-z0-9,][A-Za-z0-9,].
的内容,它等于字符串值的长度

因此,一个选择是:

Dim str As String: str = "Test_1,."
Dim pattern As String

pattern = Replace(Space(Len(str)), " ", "[A-Za-z0-9_,]")
If str Like pattern Then
    Debug.Print "Check"
Else
    Debug.Print "Nope"
End If
另一种方法是按字符对字符串进行迭代:

Dim str As String: str = "Test_1,3"
Dim pattern As String: pattern = "[A-Za-z0-9_,]"

For x = 1 To Len(str)
    If Not Mid(str, x, 1) Like pattern Then
        Debug.Print "Nope"
        Exit Sub
    End If
Next x
Debug.Print "Check"

你明确表示你只想使用
,比如
,在这里哪一个不是你最好的选择。最好的方法是使用
Regex
(正如您自己标记的那样)。但是不要混淆两者,因为没有像
+
这样的修饰符。您必须为每个字符指定模式。因此,您需要的不是非常方便的
[A-Za-z0-9,]+
,而是类似于:
[A-Za-z0-9,][A-Za-z0-9,][A-Za-z0-9,].
的内容,它等于字符串值的长度

因此,一个选择是:

Dim str As String: str = "Test_1,."
Dim pattern As String

pattern = Replace(Space(Len(str)), " ", "[A-Za-z0-9_,]")
If str Like pattern Then
    Debug.Print "Check"
Else
    Debug.Print "Nope"
End If
另一种方法是按字符对字符串进行迭代:

Dim str As String: str = "Test_1,3"
Dim pattern As String: pattern = "[A-Za-z0-9_,]"

For x = 1 To Len(str)
    If Not Mid(str, x, 1) Like pattern Then
        Debug.Print "Nope"
        Exit Sub
    End If
Next x
Debug.Print "Check"

正则表达式中通常的约定是,单词char是字母 (大写或小写),一个数字或一个“\”(下划线)

但你写下,在你的意义上,一个词也可以包含一个点(和as) 我猜,还有其他“非白人”角色)

从这组单词中,您将允许的单词实际上定义为[\w.]+, 其中:

  • \w
    匹配字母、数字和“\u”
  • 匹配自身
唯一要添加的是边界条件,以保证模式 与单词的部分不匹配,即:

  • 之前应该有文本开头或任何白色字符 (正面回顾)
  • 后面应该有文本结尾或任何白色字符 (积极前瞻)
所以我的建议是:

(?<=^|\s)[\w.]+(?=\s|$)

(?正则表达式中通常的约定是单词char是字母
(大写或小写),一个数字或一个“\”(下划线)

但你写下,在你的意义上,一个词也可以包含一个点(和as) 我猜,还有其他“非白人”角色)

从这组单词中,您将允许的单词实际上定义为[\w.]+, 其中:

  • \w
    匹配字母、数字和“\u”
  • 匹配自身
唯一要添加的是边界条件,以保证模式 与单词的部分不匹配,即:

  • 之前应该有文本开头或任何白色字符 (正面回顾)
  • 后面应该有文本结尾或任何白色字符 (积极前瞻)
所以我的建议是:

(?<=^|\s)[\w.]+(?=\s|$)

(?你所说的
是什么意思,但是[A-Za-z0-9,]+似乎没有检查一个单词。
你指的是哪些单词?模式匹配字符类中列出的一个或多个匹配项。在一侧,
[A-Za-z0-9,]
验证逗号而不是句点。我的意思是
[A-Za-z0-9.]+
不验证
abc
。您的意思是需要在字符之间查找由ASCII字母、数字、
(单词字符)和
组成的文本块,而不是字符串开头/结尾列出的字符。使用自定义边界匹配整个“单词”
(?:^ |[^\w.])[\w.]+(?![\w.])
,或锚定以匹配整个字符串,
^[\w.]+$
不,我的意思是
[A-Za-z0-9.]
似乎只检查一个字符,但我需要检查字符串的所有字符。
但[A-Za-z0-9.]是什么意思+似乎没有检查单词。
您指的是哪些单词?模式匹配字符类中列出的一个或多个匹配项。在一侧,
[a-Za-z0-9,]
验证逗号而不是句点。我的意思是
[a-Za-z0-9.\u]+
不验证
abc
。您的意思是需要在字符之间查找由ASCII字母、数字、
(单词字符)和
组成的文本块,而不是字符串开头/结尾列出的字符。使用自定义边界匹配整个“单词”
(?:^ |[^\w.])[\w.]+(?![\w.])
,或锚定以匹配整个字符串,
^[\w.]+$
否,我的意思是
[A-Za-z0-9.]
似乎只检查一个字符,但我需要检查字符串的所有字符。模式应为[.0-9A-Z\u A-Z],因为Like运算符要求字符按Ascii升序排列。指定字符范围时,它们必须按升序排列,即从最低到最高。因此,[a–Z]是有效的模式,而[Z–a]不是。"@freeflow,这对我来说没有什么不同。你能把你的陈述应用到一个例子中吗?好吧,你的意思适用于类中的范围,而不是这些范围的位置。因此,模式是很好的。我只是引用了MS帮助页面。我们都知道MS帮助有时没有什么帮助,但重点是要知道w以防出现任何奇怪的效果或错误。模式应为[.0-9A-Z_a-Z],因为Like运算符要求字符按Ascii升序排列。“当指定字符范围时,它们必须按升序排列,即从最低到最高。因此,[a–Z]是有效模式,但[Z–a]不是。”@freeflow,这对我来说没什么区别。你能把你的陈述应用到考试中吗