matches()
вернет true только в том случае, если полная строка соответствует. find()
попытается найти следующее вхождение в подстроке, которое соответствует регулярному выражению. Обратите внимание на акцент на «следующий». Это означает, что результат вызова find()
несколько раз может быть не таким. Кроме того, с помощью find()
вы можете вызвать start()
, чтобы вернуть позицию, подстроенную подстрокой.
final Matcher subMatcher = Pattern.compile("\\d+").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + subMatcher.matches());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find());
System.out.println("Found: " + subMatcher.find());
System.out.println("Matched: " + subMatcher.matches());
System.out.println("-----------");
final Matcher fullMatcher = Pattern.compile("^\\w+$").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + fullMatcher.find() + " - position " + fullMatcher.start());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
Будет выводиться:
Found: false Found: true - position 4 Found: true - position 17 Found: true - position 20 Found: false Found: false Matched: false ----------- Found: true - position 0 Found: false Found: false Matched: true Matched: true Matched: true Matched: true
Итак, будьте осторожны при многократном вызове find()
, если объект Matcher
не был сброшен, даже когда регулярное выражение окружено с ^
и $
, чтобы соответствовать полной строке.
@Mendelt Siebenga: можно только назвать GetType на свойстве значения, если переменная не устанавливается в NULL; иначе Вы получите исключение.
То, что Вы хотите сделать, использовать свойство "GetValueOrDefault" и назвать GetType на этом, так как Вам гарантируют, это не будет пустым. Пример:
Dim i As Nullable(Of Integer) = Nothing
Dim t As Type = i.GetValueOrDefault().GetType()
Вот ваш ответ в VB. Это может быть излишним для ваших целей, но также может быть полезно для некоторых других людей.
Прежде всего, вот код, чтобы выяснить, имеете ли вы дело с типом Nullable:
Private Function IsNullableType(ByVal myType As Type) As Boolean
Return (myType.IsGenericType) AndAlso (myType.GetGenericTypeDefinition() Is GetType(Nullable(Of )))
End Function
Обратите внимание на необычный синтаксис в GetType. Это необходимо. Просто выполнение GetType (Nullable), как предложил один из комментаторов, не сработало для меня.
Итак, вооружившись этим, вы можете сделать что-то вроде этого ... Здесь, в инструменте ORM, я пытаюсь получить значения в универсальный тип, который может быть или не быть Nullable:
If (Not value Is Nothing) AndAlso IsNullableType(GetType(T)) Then
Dim UnderlyingType As Type = Nullable.GetUnderlyingType(GetType(T))
Me.InnerValue = Convert.ChangeType(value, UnderlyingType)
Else
Me.InnerValue = value
End If
Обратите внимание, что я проверяю на Ничто в первой строке, потому что Convert.ChangeType захлебнется ... У вас может не быть этой проблемы, но моя ситуация чрезвычайно открыта.
Надеюсь, если я не отвечу на твой вопрос напрямую, Вы можете уничтожить это и получить, куда вам нужно идти - но я только что реализовал это несколько минут назад, и все мои тесты проходят.
Можно также использовать GetGenericParameters()
метод на том типе. myNullableObject.GetType().GetGenericParameters()[0]
должен дать Вам тип nullable, которые это (так Guid
, Int32
, и т.д.)
Я предполагаю, что проблема распознает, nullable ли свойство или нет. В C# Вы делаете это с этим кодом:
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
... но я не уверен, что эквивалент того последнего пункта находится в VB.NET.
Nullable.GetUnderylingType(myType)
вернет тип, лежащий в основе, или нулевой, если это не нулевой тип.