Строка vb.net содержит только 4-значные числа (или год)

как я могу проверить, содержит ли строка только 4-значные числа (или год)
я пробовал это

 Dim rgx As New Regex("^/d{4}")      
    Dim number As String = "0000"
    Console.WriteLine(rgx.IsMatch(number)) // true
    number = "000a"
    Console.WriteLine(rgx.IsMatch(number)) // false
    number = "000"
    Console.WriteLine(rgx.IsMatch(number)) //false
    number = "00000"
    Console.WriteLine(rgx.IsMatch(number))  // true <<< :(

это возвращает false, когда его меньше 4 или символов, но не более 4

Спасибо!


person user2653652    schedule 28.03.2015    source источник
comment
что мне тогда использовать?   -  person user2653652    schedule 28.03.2015
comment
Пишу ответ сейчас.   -  person AStopher    schedule 28.03.2015
comment
Авинаш Радж, это работает :), но жду ʎǝʞuoɯɹǝqʎɔ, почему я не должен использовать Regex   -  person user2653652    schedule 28.03.2015
comment
@ʎǝʞuoɯɹǝqʎɔ, Try not to use Regex, it's not designed for this sort of thing — этот комментарий немного удивляет.   -  person cel    schedule 28.03.2015
comment
@cel Регулярное выражение предназначено для сопоставления строк, хотя его можно использовать для этого. Я немного удивлен, что OP пошел по пути его использования.   -  person AStopher    schedule 28.03.2015
comment
Является ли 0123 допустимым годом? А 9015?   -  person Joel Coehoorn    schedule 28.03.2015
comment
@user2653652 user2653652 Я обновил свой ответ, чтобы предоставить код, который лучше подходит для того, что вы пытаетесь сделать, пожалуйста, просмотрите его.   -  person AStopher    schedule 28.03.2015


Ответы (3)


На самом деле я бы не стал использовать регулярное выражение для этого. Выражение обманчиво простое (^\d{4}$), пока вы не поймете, что вам также нужно оценить это числовое значение, чтобы определить действительный диапазон лет... если только вам не нужны такие годы, как 0013 или 9015. В любом случае, вы, скорее всего, захотите, чтобы значение было целым числом. Учитывая это, лучшая проверка, вероятно, состоит в том, чтобы просто попытаться преобразовать его в целое число сразу же:

Dim numbers() As String = {"0000", "000a", "000", "00000"}
For Each number As String In numbers
    Dim n As Integer
    If Integer.TryParse(number, n) AndAlso number.Length = 4 Then
        'It's a number. Now look at other criteria

    End If 
Next 
person Joel Coehoorn    schedule 28.03.2015
comment
Как ни странно, Integer.TryParse точно такой же, как IsNumeric, только с дополнительной проверкой. - person AStopher; 28.03.2015
comment
разница в том, что я думаю, что он анализирует его до целого числа, которое не может иметь десятичных чисел. и вот почему это работает для меня, я думаю - person user2653652; 28.03.2015
comment
TryParse() НЕ совпадает с IsNumeric(). На самом деле в результате получается целочисленная переменная. IsNumeric() использует другую реализацию для совместимости со старым кодом, и это наивная и глупая функция. - person Joel Coehoorn; 28.03.2015
comment
@user2653652 user2653652 Дело не только в десятичных дробях. дело также в том, что он намеренно сохраняет некоторые ... странные поведения для целей обратной совместимости с кодом, перенесенным из эпохи vb6. - person Joel Coehoorn; 28.03.2015

Используйте LINQ, чтобы проверить, соответствует ли Все символы IsDigit:

Dim result As Boolean = ((Not number Is Nothing) AndAlso ((number.Length = 4) AndAlso number.All(Function(c) Char.IsDigit(c))))
person Bjørn-Roger Kringsjå    schedule 28.03.2015
comment
Здесь нет обработки ошибок, есть сотни ситуаций, когда это может вызвать проблемы. - person AStopher; 28.03.2015
comment
Обработка ошибок?? Числовая переменная определена и инициализирована как Dim number As String = "0000". Как могут быть сотни ситуаций, когда это может вызвать проблемы? - person Bjørn-Roger Kringsjå; 28.03.2015

Вы должны использовать функции манипулирования строками .NET.

Во-первых требования, строка должна:

  • Содержит ровно четыре символа, не больше и не меньше;
  • Должен состоять из числового значения

Однако ваша цель - проверить Date:

Function isKnownGoodDate(ByVal input As String) As Boolean 'Define the function and its return value.
    Try 'Try..Catch statement (error handling). Means an input with a space (for example ` ` won't cause a crash)
        If (IsNumeric(input)) Then 'Checks if the input is a number
            If (input.Length = 4) Then
                Dim MyDate As String = "#01/01/" + input + "#"
                If (IsDate(MyDate)) Then
                    Return True
                End If
            End If
        End If
    Catch
        Return False
    End Try
End Function

Вы можете увидеть предупреждение:

Функция isKnownGoodDate не возвращает значение для всех путей кода. Вам не хватает оператора Return?

это можно смело игнорировать.

person AStopher    schedule 28.03.2015
comment
Спасибо, просто любопытно, почему я не должен использовать Regex, что-то о производительности? - person user2653652; 28.03.2015
comment
и разве IsNumeric также не возвращает true при двойном? - person user2653652; 28.03.2015
comment
IsNumeric() — очень наивная оценка. Не все, что оценивается как числовое, может быть преобразовано в число, и не все, что является числом, оценивается как числовое. - person Joel Coehoorn; 28.03.2015
comment
я проверил, что ввод кода = 00.1 также возвращает значение true, а возврата false не происходит - person user2653652; 28.03.2015
comment
@user2653652 user2653652 Проверьте код, который я добавил, он должен выполнять эту работу за вас (как я сам проверял), он, скорее всего, сработает для вас, поскольку типы Date не могут быть 01/01/19.04. - person AStopher; 28.03.2015
comment
@user2653652 user2653652 Просто любопытно, пытаетесь ли вы проверить даты с определенными свойствами (например, даты в будущем, за последние 100 лет и т. д.)? - person AStopher; 28.03.2015