【问题标题】:How to do regular expressions in vb.net如何在 vb.net 中做正则表达式
【发布时间】:2012-11-29 11:31:52
【问题描述】:

所以这里有很多关于正则表达式的问题和答案。缺点是绝大多数答案只是 正则表达式...

我也用谷歌搜索了数百个网站。试图通过所有内容来快速理解和实施答案并不容易。它们要么使用不同的语言——这可能不应该有任何区别,尽管你在 C# 到 VB 中的转义方式不同,这会导致混淆什么是转义字符与正则表达式开关。

我正在努力的部分是理解它们,这样我就可以实现一些显然很简单的表达式。

我的场景:

我必须检查给定字符串中的每个字符,如果正则表达式不允许任何字符,那么它应该返回 false。

示例:

我尝试了以下表达式(从这里的各种答案复制/粘贴......)

Dim r As New Regex("^[a-zA-Z0-9 ]*$")

也试过

Dim r As New Regex("[a-zA-Z0-9\s]")

也试过

Dim r as New Regex("^[A-Za-z0-9 ]*")

我一直在这样实现:

Dim r As New Regex(_fontJIAdieuxRegEx) '' where _fontJIAdieuxRegEx is one of the above regex strings.
Dim supported = r.IsMatch(fontName)

我一直在尝试验证以下内容:

darren 应该返回 True

da-rren 应该返回 False,因为 - 连字符

da rren 应该返回 True

现在,简单地说,这些表达式中的任何一个都将为所有字符串返回True,或者为所有字符串返回False;所以我显然做错了什么。

我真的很感激有人指出我哪里出错了,并解释一下正则表达式的构成。

一旦我对它们有了更多了解,我需要能够使用不同的表达方式来允许其他字符,例如! @ " ' . 等等。所以请不要只粘贴表达式来解决上面的简单示例。

【问题讨论】:

    标签: asp.net regex vb.net


    【解决方案1】:

    第一个模式是正确的。如果字符串中只有一个字符匹配,则第二种模式将返回 true。如果字符串开头的零个或多个字符匹配,第三个模式将返回 true,它总是这样。

    我不知道你做了什么让它不起作用,但是像这样使用它是可行的:

    Dim _fontJIAdieuxRegEx As String = "^[a-zA-Z0-9 ]*$"
    
    Dim r As New Regex(_fontJIAdieuxRegEx)
    
    Console.WriteLine(r.IsMatch("darren"))
    Console.WriteLine(r.IsMatch("da-rren"))
    Console.WriteLine(r.IsMatch("da rren"))
    

    输出:

    True
    False
    True
    

    【讨论】:

    • 我现在得到了我的第一个匹配模式,谢谢 :) - 似乎我的源代码中有一个错字,这不是问题所在。您介意大致解释一下^*$ 的作用吗?对于'" 之类的东西,我该如何逃脱?
    • ^ 字符是字符串开头的。小心,因为这个字符在不同的地方使用时可能有另一种含义。这里的* 字符表示匹配表达式的前面部分零次或多次,而$ 字符是另一个anchor,这次匹配到字符串的末尾。总而言之,它们意味着在字符串的开头匹配这个集合零次或多次,一直到字符串的结尾。
    • 啊,明白了。我想现在它开始点击更多了。我刚刚尝试将一堆字符添加到字符类并最终得到一个ArgumentException - parsing "^[a-zA-Z0-9 '_-()&#!+:;=]*$" - [x-y] range in reverse order。我认为这是导致问题的' 字符。如何在 VB 中转义 '" 等字符以及其他保留字符?再次感谢您的帮助
    • @Darren:撇号不是问题,但破折号是。你有_-( 的范围,这意味着从_( 的所有字符,但是你得到了解析错误,因为_( 之后。由于您根本不希望它成为一个范围,因此您应该使用 \- 转义破折号。
    • 您必须记住的另一件事是 * 默认情况下是贪婪的,这意味着它尽可能匹配。如果你添加一个?之后,它变得非贪婪,匹配尽可能少。
    【解决方案2】:

    正则表达式类位于命名空间System.Text.RegularExpressions。要使它们可用,请将 Imports System.Text.RegularExpressions 放在源代码的开头。

    Regex.IsMatch("subject", "regex") 
    

    检查正则表达式是否匹配主题字符串。

    Regex.Replace("subject", "regex", "replacement") 
    

    执行搜索和替换。

    Regex.Split("subject", "regex") 
    

    如上所述将主题字符串拆分为字符串数组。所有这些方法都接受RegexOptions 类型的可选附加参数,如构造函数。

    来源/更多信息:http://www.regular-expressions.info/dotnet.html

    【讨论】:

    • 感谢 Daan - 欢迎来到 SO。我更想了解正则表达式是如何组合在一起的,而不是如何调用代码;我已经让那部分工作了。糟糕的是我的模式:)
    【解决方案3】:

    您的第二个表达式匹配 anything。字符类末尾的* 字符告诉正则表达式引擎匹配该字符类 次或更多次。由于表达式中没有其他条件,因此任何字符串都是有效的。第三个表达式匹配至少包含一个有效字符的任何内容。

    第一个表达式应该可以,但如果你不需要它们,我不喜欢开始和结束锚点(^$)。我会在这里做的是 invert 表达式...查找无效的字符。表达式如下所示:

    [^A-Za-z0-9 ]

    在这种情况下,用作字符类一部分的^ 字符意味着否定该类:这将匹配该类中的任何字符,并且由于我们没有任何锚点,因此如果这样的字符出现在字符串中的任何位置,它将匹配。现在,当然,我还必须在 VB.Net 代码中反转结果:

    Dim r As New Regex("[^A-Za-z0-9 ]")
    Dim supported = Not r.IsMatch(fontName)
    

    【讨论】:

    • 谢谢乔尔,看起来整洁多了!
    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多