web-dev-qa-db-ja.com

文字列から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で検索しました。

[編集]-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
}
64
Brian Boatright

VBScriptにある種の「正規表現の置換」機能があるかどうかはわかりませんが、ある場合は、この擬似コードのようなことができます。

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

私はVBScriptを知らないので、正確なコードを提供することはできませんが、これは数字以外のものを削除します。

編集:グローバルフラグ(正規表現の最後に「g」)があることを確認してください。そうでない場合は、文字列の最初の非数字にのみ一致します。

11
Sasha Chedygov

.NETでは、文字列から数字だけを抽出できます。このような:

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

メインの.Netソリューションに代わるものとして、 類似した質問 回答から適応しました:

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

注:ここでは問題の半分しか解決していません。

「インザワイルド」と入力された米国の電話番号の場合、次のようになります。

  • 「1」プレフィックス付きまたはなしの電話番号
  • 市外局番の有無にかかわらず電話番号
  • 内線番号付きの電話番号(すべての非数字をやみくもに削除すると、「x」または「Ext。」または回線上の何でも見逃します)。
  • ニーモニック文字でエンコードされた数字(800-BUY-THISまたは何でも)

データベースに実際に検索する単一の標準に結果の数字リストを適合させるために、コードにスマートを追加する必要があります。

これを修正するためにできる簡単なこと:

  • RegExで数字以外を削除する前に、文字列に「x」があるかどうかを確認してください。ある場合は、その後すべてを切り取ります(内線番号を記述するほとんどのバージョンを処理します)。

  • 「1」で始まる10桁以上の数字の場合、1を切り取ります。市外局番の一部ではなく、米国の市外局番は2xxの範囲で始まります。

  • まだ10桁を超える数値については、残りが何らかの拡張であると想定し、切り捨てます。

  • 「ends-with」パターン検索を使用してデータベース検索を実行します(SELECT * FROM mytable WHERE phonenumber LIKE 'blah%')。これにより、市外局番は提供されませんが、データベースに番号with市外局番が含まれる場所(エラーの可能性はあります)が処理されます。

6
richardtallent

物事の見た目では、10桁の電話番号をキャッチしようとしています。

テキストの文字列を最初に置き換えて、次の文字を削除しないでください。

<SPACE> , . ( ) - [ ] 

その後、10桁の数字の正規表現検索を行うことができます。

\d{10}
1
Eoin Campbell

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
user4914655

Regexlibで phone nr category を実行しましたか。かなりの数があなたが必要なことをするようです。

0
Ólafur Waage