Возвращать только цифры 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
С#
string resultString = null;
try {
Regex regexObj = new Regex(@"[^\d]");
resultString = regexObj.Replace(subjectString, "");
} catch (ArgumentException ex) {
// Syntax error in the regular expression
}
Ответы
Ответ 1
Я не знаю, есть ли у VBScript какая-то функция замены "регулярного выражения", но если это так, то вы можете сделать что-то вроде этого псевдокода:
reg_replace(/\D+/g, '', your_string)
Я не знаю VBScript, поэтому я не могу дать вам точный код, но это удалит все, что не является числом.
EDIT: убедитесь, что у вас есть глобальный флаг ( "g" в конце regexp), иначе он будет соответствовать только первому не номеру в вашей строке.
Ответ 2
В .NET вы можете извлечь только цифры из строки. Вот так:
string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
Ответ 3
Примечание. Вы решили решить только половину проблемы.
Для номеров телефонов США, введенных "в дикой природе", вы можете:
- Номера телефонов с префиксом "1" или без него
- Номера телефонов с кодом города или без него
- Телефонные номера с добавочными номерами (если вы вслепую удалите все разряды, вы пропустите "x" или "Ext." или что-то еще на линии).
- Возможно, числа, закодированные мнемоническими буквами (800-BUY-THIS или что-то еще)
Вам нужно добавить некоторые символы в свой код, чтобы согласовать полученный список цифр с одним стандартом, который вы фактически просматриваете в своей базе данных.
Некоторые простые вещи, которые вы могли бы сделать, чтобы исправить это:
-
Прежде чем удалить RegEx без цифр, посмотрите, есть ли в строке "x". Если есть, отрубите все после него (будет обрабатывать большинство версий написания добавочного номера).
-
Для любого числа с 10 + цифрами, начинающимися с символа "1", отрубайте 1. Это не часть кода зоны, коды зоны США начинаются в диапазоне 2xx.
-
Для любого числа, все еще превышающего 10 цифр, предположим, что остаток является расширением какого-то рода и отрубает его.
-
Выполняйте поиск в базе данных с помощью поиска по шаблонам "заканчивается с" (SELECT * FROM mytable WHERE phonenumber LIKE 'blah%'). Это будет обрабатывать синтаксис (хотя и с возможностью ошибки), если код области не указан, но ваша база данных имеет номер с кодом области.
Ответ 4
В качестве альтернативы главному решению .Net
, адаптированному из ответа аналогичного вопроса:
string justNumbers = string.Concat(text.Where(char.IsDigit));
Ответ 5
По соображениям вещей, вы пытаетесь поймать любой 10-значный номер телефона....
Почему бы не заменить строку, прежде всего, на текст, чтобы удалить любой из следующих символов.
<SPACE> , . ( ) - [ ]
Затем после этого вы можете просто выполнить поиск в регулярном выражении для 10-значного числа.
\d{10}
Ответ 6
Пропустили ли вы номер телефона в regexlib. Похоже, что некоторые делают то, что вам нужно.
Ответ 7
В отношении пунктов, сделанных 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
Ответ 8
Мне нравится работать с методами расширений всегда, когда я манипулирую нативными объектами, такими как string, int, datetime и т.д.
В этом случае полный класс для метода расширения, который вы можете увидеть ниже:
namespace System
{
public static class StringExtension
{
public static string GetNumbers(this string str)
{
if( str != null)
{
var justNumbers = new String(str.Where(c => Char.IsDigit(c)).ToArray());
return justNumbers;
} //if
return "";
} //GetNumbers
public static string GetLetters(this string str)
{
if( str != null)
{
var justLetters = new String(str.Where(c => Char.IsLetter(c)).ToArray());
return justLetters;
} //if
return "";
} //GetLetters
} //class
} //namespace
Использовать просто:
string myStr = "A0B1C2D3F";
string myStrJustNumbers = myStr.GetNumbers();
/* myStrJustNumbers = "0123" */