仅返回字符串中的数字0-9

Bri*_*ght 66 c# regex vb.net vbscript code-generation

我需要一个可以在VBScript和.NET中使用的正则表达式,它只返回字符串中的数字.

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

  • 123 123 1234
  • (123)123-1234
  • 123-123-1234
  • (123)123-1234
  • 123.123.1234
  • 123 123 1234
  • 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, "")
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

C#

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

Mat*_*ton 184

在.NET中,您只能从字符串中提取数字.像这样:

string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
Run Code Online (Sandbox Code Playgroud)

  • +10.只是为了那里的所有人,请不要忘记`使用System.Linq;`为此.对我来说,VS2010只是说没有这样的方法"Where"用于字符串,而IntelliSense不会给我使用声明的自动添加. (8认同)
  • 我准备发表评论,"/显然/,正则表达式对此更快",但我在Mono中运行了一个(不科学的)基准,Linq赢了(大约是正则表达式持续时间的一半).:)所以我的帽子给你了. (4认同)
  • 附:我知道我已经用 C# 回答了一个 VB 问题,但由于它是 .NET,我认为值得把这个想法放在那里。对于这么简单的事情,RegEx 似乎有点矫枉过正。 (2认同)

Sas*_*gov 12

我不知道VBScript是否有某种"正则表达式替换"函数,但如果它有,那么你可以做类似这样的伪代码:

reg_replace(/\D+/g, '', your_string)
Run Code Online (Sandbox Code Playgroud)

我不知道VBScript所以我不能给你确切的代码,但这将删除任何不是数字的东西.

编辑:确保有全局标志(正则表达式末尾的"g"),否则它只匹配字符串中的第一个非数字.

  • 如果你想用 .NET 类来做,基本上就是 re = Regex("\D"); re.Replace("123 123 1234", ""). 请记住缓存您的 Regex 对象(不要在每次调用该方法时都编译它们)。 (2认同)

Teo*_*ite 12

作为主要.Net解决方案的替代方案,改编自类似问题的答案:

string justNumbers = string.Concat(text.Where(char.IsDigit));
Run Code Online (Sandbox Code Playgroud)


ric*_*ent 6

注意:你这里只解决了一半的问题.

对于"在野外"输入的美国电话号码,您可能拥有:

  • 带或不带"1"前缀的电话号码
  • 带或不带区号的电话号码
  • 带有分机号码的电话号码(如果你盲目删除所有非数字,你会错过"x"或"分机"或线路上的任何内容).
  • 可能是用助记符编码的数字(800-BUY-THIS或其他)

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

你可以做一些简单的事情来解决这个问题:

  • 在RegEx删除非数字之前,查看字符串中是否有"x".如果有的话,在它之后切掉一切(将处理大多数版本的分机编号).

  • 对于任何以"1"开头的10位以上的数字,请切断1.它不是区号的一部分,美国区号从2xx范围开始.

  • 对于任何仍然超过10位的数字,假设余数是某种类型的扩展,并将其删除.

  • 使用"结束"模式搜索进行数据库搜索(SELECT*FROM mytable WHERE phonenumber LIKE'blah%').这将处理sitations(虽然与错误的可能性),不设置区号,但你的数据库具有数量区号.