仅从字符串返回数字0-9


69

我需要一个可以在VBScript和.NET中使用的正则表达式,该正则表达式将仅返回在字符串中找到的数字。

例如,以下任何“字符串”应仅返回1231231234

  • 1231231234
  • (123)123-1234
  • 123-123-1234
  • (123)123-1234
  • 123.123.1234
  • 1231231234
  • 1 2 3 1 2 3 1 2 3 4

这将在电子邮件解析器中用于查找客户可能在电子邮件中提供的电话号码并进行数据库搜索。

我可能错过了类似的正则表达式,但是我确实在regexlib.com上进行了搜索。

[编辑]-在设置musicfreak的答案后添加了RegexBuddy生成的代码

VBScript代码

Dim myRegExp, ResultString
Set myRegExp = New RegExp
myRegExp.Global = True
myRegExp.Pattern = "[^\d]"
ResultString = myRegExp.Replace(SubjectString, "")

VB.NET

Dim ResultString As String
Try
      Dim RegexObj As New Regex("[^\d]")
      ResultString = RegexObj.Replace(SubjectString, "")
Catch ex As ArgumentException
      'Syntax error in the regular expression
End Try

C#

string resultString = null;
try {
    Regex regexObj = new Regex(@"[^\d]");
    resultString = regexObj.Replace(subjectString, "");
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

1
如我所说,\ D比^ \ d更简单。
马修·弗拉申

Answers:


13

我不知道VBScript是否具有某种“正则表达式替换”功能,但是如果这样做,则可以执行以下伪代码操作:

reg_replace(/\D+/g, '', your_string)

我不知道VBScript,所以我无法给您确切的代码,但这会删除任何非数字的内容。

编辑:确保具有全局标志(在正则表达式末尾的“ g”),否则它将仅与字符串中的第一个非数字匹配。


谢谢!那正是我想要做的。我知道它一定有点简单。我正在使用RegExBuddy,将尝试对其进行测试,然后发布VBScript代码。我相信VBScript会替代。
布赖恩·伯特赖特

2
如果您想使用.NET类,则基本上是re = Regex(“ \ D”); re.Replace(“ 123 123 1234”,“”)。记住要缓存您的Regex对象(不要在每次调用该方法时都对其进行编译)。
马修·弗拉申

191

在.NET中,您可以仅从字符串中提取数字。像这样:

string justNumbers = new String(text.Where(Char.IsDigit).ToArray());

1
ps。我知道我已经用C#回答了VB问题,但是由于它是.NET,所以我认为有必要将其付诸实践。RegEx似乎对于这种简单的事情来说过于矫kill过正。
马特·汉密尔顿,2009年

实际上,我需要在经典ASP页面中使用VBScript,但感谢您的回答。
布赖恩·伯特赖特

4
我本来打算以“ / Clearly /,正则表达式为此更快”的方式发表评论,但是我在Mono中运行了(不科学的)基准测试,Linq获胜(大约是正则表达式持续时间的一半)。:)所以,我的帽子对你不利。
马修·弗拉申

8
+10。只是要对那里的每个人都保持警惕,不要忘记using System.Linq;这一点。对我来说,VS2010只是说对字符串没有这样的方法“ Where”,并且IntelliSense不会给我using语句的自动添加。
DanM7 2013年

您还需要使用System.Linq.Expressions:使用System.Linq; 使用System.Linq.Expressions;
WoodsLink '16


6

注意:您在这里只解决了一半的问题。

对于“在野外”输入的美国电话号码,您可能需要:

  • 带或不带“ 1”前缀的电话号码
  • 带或不带区号的电话号码
  • 带有分机号码的电话号码(如果您盲目删除所有非数字,则将错过“ x”或“ Ext。”,或者线路上的其他内容)。
  • 可能是用助记符字母编码的数字(800买-THIS或其他)

您需要在代码中添加一些智能,以使结果的数字列表符合您在数据库中实际搜索的单个标准。

您可以执行一些简单的操作来解决此问题:

  • 在RegEx删除非数字字符之前,请查看字符串中是否有“ x”。如果有,请砍掉所有内容(将处理大多数版本的分机号)。

  • 对于任何以“ 1”开头的10位数以上的数字,请砍掉1。这不是区号的一部分,美国区号的开头是2xx范围。

  • 对于仍然超过10位的任何数字,请假设余数是某种形式的扩展,然后将其砍掉。

  • 使用“ ends-with”模式搜索来进行数据库搜索(SELECT * FROM mytable WHERE电话号码,例如“ blah%”)。这将处理未提供区号的情况(尽管可能会出错),但是您的数据库具有区号的数字。


1
真正。我确实在正则表达式之后添加了一些东西,如果它是10位数字,则返回整个字符串;如果更长,则返回right(string,10)。您最后的建议是一个好建议,我会补充一点。谢谢!+1
Brian Boatright,

好点!我在下面添加了我的意见书以解决此问题。

1

从外观上看,您试图捕获任何10位数字的电话号码。

为什么不首先在文本上替换字符串以删除以下任何字符。

<SPACE> , . ( ) - [ ] 

然后,您可以只对10位数字进行正则表达式搜索。

\d{10}

就是这样,但是我想使其与更大范围的输入字符串匹配。
布赖恩·伯特赖特


0

关于richardtallent提出的要点,此代码将处理有关分机号码的大多数问题,并以美国国家代码(+1)为前缀。

这不是最优雅的解决方案,但是我必须快速解决问题,以便继续进行自己的工作。

希望对您有所帮助。

 Public Shared Function JustNumbers(inputString As String) As String
        Dim outString As String = ""
        Dim nEnds As Integer = -1

        ' Cycle through and test the ASCII character code of each character in the string. Remove everything non-numeric except "x" (in the event an extension is in the string as follows):
        '    331-123-3451 extension 405  becomes 3311233451x405
        '    226-123-4567 ext 405        becomes 2261234567x405
        '    226-123-4567 x 405          becomes 2261234567x405
        For l = 1 To inputString.Length
            Dim tmp As String = Mid(inputString, l, 1)
            If (Asc(tmp) >= 48 And Asc(tmp) <= 57) Then
                outString &= tmp
            ElseIf Asc(tmp.ToLower) = 120
                outString &= tmp
                nEnds = l
            End If
        Next


        ' Remove the leading US country code 1 after doing some validation
        If outString.Length > 0 Then
            If Strings.Left(outString, 1) = "1" Then

                ' If the nEnds flag is still -1, that means no extension was added above, set it to the full length of the string
                ' otherwise, an extension number was detected, and that should be the nEnds (number ends) position.
                If nEnds = -1 Then nEnds = outString.Length

                ' We hit a 10+ digit phone number, this means an area code is prefixed; 
                ' Remove the trailing 1 in case someone put in the US country code
                ' This is technically safe, since there are no US area codes that start with a 1. The start digits are 2-9
                If nEnds > 10 Then
                    outString = Right(outString, outString.Length - 1)
                End If
            End If
        End If

        Debug.Print(inputString + "          : became : " + outString)

        Return outString
    End Function

0

没有正则表达式的最简单解决方案:

public string DigitsOnly(string s)
   {
     string res = "";
     for (int i = 0; i < s.Length; i++)
     {
       if (Char.IsDigit(s[i]))
        res += s[i];
     }
     return res;
   }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.