Поиск строки для определенных чисел - PullRequest
3 голосов
/ 14 января 2011

Я пытаюсь найти молниеносное решение, чтобы найти части в строке. Вот пример строки:

"PostLoad успешно! Вы перевели сумму 17.00 Rs на 03334224222 . Теперь используйте PostLoad, набрав 123. PostLoad в SMS закончится 01-03-2011."

Цель: необходимо получить значения, выделенные жирным шрифтом: количество и номер ячейки. Содержимое строки изменяется незначительно, но номер ячейки всегда будет 11-значным. Сумма всегда с точностью до двух десятичных знаков. Любые предложения с использованием C # и RegEx?

Ответы [ 2 ]

10 голосов
/ 14 января 2011
Regex regexObj = new Regex(@"(\b\d+\.\d{2}\b).*?(\b\d{11}\b)");
Match matchResults = regexObj.Match(subjectString);
while (matchResults.Success) {
    for (int i = 1; i < matchResults.Groups.Count; i++) {
        Group groupObj = matchResults.Groups[i];
        if (groupObj.Success) {
            // matched text: groupObj.Value
            // match start: groupObj.Index
            // match length: groupObj.Length
        } 
    }

Объяснение:

(       # Match and capture the following:
 \b     # Assert that the match starts at a "word boundary"
 \d+    # Match one or more digits
 \.     # Match a .
 \d{2}  # Match exactly two digits
 \b     # Assert that the number ends here
)       # End of first capturing group
.*?     # Match any number of intervening characters; as few as possible
(       # Match and capture...
 \b     # Word boundary
 \d{11} # Exactly 11 digits
 \b     # Word boundary
)       # End of match

Группа № 1 будет содержать десятичное число, группа № 2 будет содержать 11-значное число.

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

Это гарантирует, что числа типа 12.3456 не будут совпадать;с другой стороны, необходимо, чтобы числа были разделены пробелами, пунктуацией или другими символами, отличными от букв.Например, в number12.34 регулярное выражение не будет соответствовать 12.34.

0 голосов
/ 15 января 2011

Вот преобразование в VB.Net.Надеюсь, я правильно понял.

Dim regexObj As New Regex("(\b\d+\.\d{2}\b).*?(\b\d{11}\b)")
Dim matchResults As Match = regexObj.Match(lActualSenderMessage)

While matchResults.Success
    For i As Integer = 1 To matchResults.Groups.Count - 1
        Dim groupObj As Group = matchResults.Groups(i)
        ' matched text: groupObj.Value
        ' match start: groupObj.Index
        ' match length: groupObj.Length
        If groupObj.Success Then
        End If
    Next
End While
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...