возвращает только цифры 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
Это будет использоваться в парсер email, чтобы найти телефонные номера, которые клиенты могут предоставить в электронной почте и сделать поиск по базе.
возможно, я пропустил подобное регулярное выражение, но я искал 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
}
7 ответов:
Я не знаю, есть ли у VBScript какая-то функция" замены регулярного выражения", но если это так, то вы можете сделать что-то вроде этого псевдокода:
reg_replace(/\D+/g, '', your_string)Я не знаю VBScript, поэтому я не могу дать вам точный код, но это удалит все, что не является числом.
EDIT: убедитесь, что у вас есть глобальный флаг ("g" в конце регулярного выражения), иначе он будет соответствовать только первому не-числу в вашей строке.
в .NET, вы можете извлечь только цифры из строки. Вот так:
string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
Примечание: Вы только решили половину проблемы здесь.
для нас номера телефонов, введенные "в дикой природе", вы можете иметь:
- номера телефонов с префиксом "1" или без него
- номера телефонов с кодом города или без него
- номера телефонов с добавочными номерами (если вы слепо удалите все не-цифры, вы пропустите "x" или "Ext."или что-то еще на линии).
- возможно, цифры закодированы мнемоническими буквами (800-купить-это или все равно)
вам нужно будет добавить некоторые умные данные в свой код, чтобы соответствовать результирующему списку цифр единому стандарту, который вы фактически ищете в своей базе данных.
некоторые простые вещи, которые вы могли сделать, чтобы исправить это:
перед удалением регулярных выражений без цифр, посмотрите, есть ли" x " в строке. Если есть, отрежьте все после него (будет обрабатывать большинство версий написания добавочного номера).
для любого числа с 10+ цифр, начинающихся с "1", отрубить 1. Это не часть кода города, коды США начинаются в диапазоне 2xx.
для любого числа, все еще превышающего 10 цифр, предположим, что остаток является расширением какого-то вида, и отрубить его.
выполните поиск в базе данных с помощью поиска по шаблону "заканчивается" (выберите * из таблицы mytable, где номер телефона, например " blah%"). Это будет обрабатывать размещения (хотя с возможностью ошибки) где код города не указан, но в вашей базе данных есть номер С код.
как альтернатива основному
.Netрешение, адаптированное от подобный вопрос ответ:string justNumbers = string.Concat(text.Where(char.IsDigit));
судя по всему, вы пытаетесь поймать любой 10-значный номер телефона....
почему бы не сделать строку заменить в первую очередь на текст, чтобы удалить любой из следующих символов.
<SPACE> , . ( ) - [ ]затем вы можете просто выполнить поиск регулярных выражений для 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
Comments