возвращать только цифры 0-9 из строки

Мне нужно регулярное выражение, которое я могу использовать в 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.

[EDIT] – Добавлен код, созданный RegexBuddy после настройки ответа musicfreak

Код 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 } 

Я не знаю, есть ли у VBScript какая-то функция «замены регулярного выражения», но если это так, то вы можете сделать что-то вроде этого псевдокода:

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

Я не знаю VBScript, поэтому я не могу дать вам точный код, но это удалит все, что не является числом.

EDIT: убедитесь, что у вас есть глобальный флаг («g» в конце regexp), иначе он будет соответствовать только первому не номеру в вашей строке.

В .NET вы можете извлечь только цифры из строки. Как это:

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

Примечание. Вы решили решить половину проблемы здесь.

Для номеров телефонов США, введенных «в дикой природе», у вас могут быть:

  • Номера телефонов с префиксом «1» или без него
  • Телефонные номера с кодом города или без него
  • Телефонные номера с добавочными номерами (если вы вслепую удалите все цифры, вы пропустите «x» или «Ext» или что-то еще на линии).
  • Возможно, числа, закодированные мнемоническими буквами (800-КУПИТЬ-ЭТО или что-то еще)

Вам нужно добавить некоторые символы в свой код, чтобы согласовать полученный список цифр с одним стандартом, который вы фактически просматриваете в своей базе данных.

Некоторые простые вещи, которые вы могли бы сделать, чтобы исправить это:

  • Прежде чем удалить RegEx без цифр, посмотрите, есть ли в строке «x». Если есть, отрубите все после него (будет обрабатывать большинство версий написания добавочного номера).

  • Для любого числа с 10 + цифрами, начинающимися с «1», отрубите 1. Это не часть кода области, коды США в США начинаются в диапазоне 2xx.

  • Для любого числа, все еще превышающего 10 цифр, предположим, что остаток является расширением какого-то рода и отрубает его.

  • Выполняйте поиск в базе данных с помощью поиска по шаблонам «заканчивается с» (SELECT * FROM mytable WHERE phonenumber LIKE ‘blah%’). Это будет обрабатывать синтаксис (хотя и с возможностью ошибки), если код области не указан, но ваша firebase database имеет номер с кодом области.

В качестве альтернативы основному .Net решению, адаптированному из ответа на аналогичный вопрос :

 string justNumbers = string.Concat(text.Where(char.IsDigit)); 

По внешности вещей, вы пытаетесь поймать любой 10-значный номер телефона ….

Почему бы не заменить строку, прежде всего, на текст, чтобы удалить любой из следующих символов.

  , . ( ) - [ ] 

Затем после этого вы можете просто выполнить поиск в регулярном выражении для 10-значного числа.

 \d{10} 

Вы прошли номер телефона nr в regexlib. Похоже, что некоторые делают то, что вам нужно.

В отношении пунктов, сделанных 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 
Давайте будем гением компьютера.