Хотя ответы, которые вы не можете проанализировать HTML с регулярными выражениями, верны, они не применяются здесь. OP просто хочет проанализировать один тег HTML с регулярными выражениями, и это то, что можно сделать с помощью регулярного выражения.
Предлагаемое регулярное выражение неверно:
<([a-z]+) *[^/]*?>
Если вы добавите что-то в регулярное выражение, путем обратного отслеживания его можно заставить сопоставить такие глупые вещи, как <a >>
, [^/]
слишком разрешительно. Также обратите внимание, что <space>*[^/]*
является избыточным, поскольку [^/]*
также может соответствовать пробелам.
Мое предложение было бы
<([a-z]+)[^>]*(?<!/)>
Где (?<! ... )
(в Perl-регулярных выражениях) отрицательный внешний вид. Он читает «a», затем слово, а затем все, что не является>, последнее из которых не может быть /, а затем> «.
Обратите внимание, что это позволяет такие вещи, как <a/ >
( как и исходное регулярное выражение), поэтому, если вы хотите что-то более ограничительное, вам нужно создать регулярное выражение для соответствия парам атрибутов, разделенных пробелами.
Or/And
всегда всегда оценивает как 1 выражения, а затем возвращает результат. Короткое замыкание не .
OrElse/AndAlso
- короткое замыкание . Правильное выражение оценивается только в том случае, если результат не может быть определен из оценки только левого выражения. (Это означает, что OrElse
будет оценивать только правильное выражение, если левое выражение ложно, а AndAlso
будет оценивать только правильное выражение, если левое выражение истинно.)
Предполагая, что в выражениях нет побочных эффектов , а выражения не зависят (и любые служебные данные исполнения игнорируются), то они одинаковы.
Однако во многих случаем является то, что выражения зависят . Например, мы хотим что-то сделать, когда List is not-Nothing и имеет более одного элемента:
If list IsNot Nothing AndAlso list.Length > 0 Then .. 'list has stuff
Это также можно использовать, чтобы избежать «дорогого» вычисления (или побочных эффектов, ick!):
If Not Validate(x) OrElse Not ExpensiveValidate(x) Then .. 'not valid
Лично я считаю, что AndAlso
и OrElse
являются правильными операторами для использования во всех, кроме 1% - или меньше, надеюсь ! - случаев, когда желателен побочный эффект .
Счастливое кодирование.
1 Исключение, созданное в первом выражении, предотвратит второе выражение от оценки, но это вряд ли удивительно.
Разница в том, что OrElse и AndAlso будут замыкаться на короткое замыкание на основе первого условия, что означает, что если первое условие не пройдет, второе (или более) условие не будет оценено. Это особенно полезно, когда одно из условий может быть более интенсивным, чем другое.
Пример, где Or
является точным (оба условия оцениваются):
If Name = "Fred" Or Name = "Sam" Then
Это действительно doesn «независимо от того, каким образом они оцениваются
. Следующая AndAlso
полезна, потому что второе условие может потерпеть неудачу
If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then
Это позволяет первому условию проверить, является ли объект был установлен, и только если он был установлен, пойдет и проверит базу данных (или другую задачу). Если это было простое ключевое слово And
, оба будут оцениваться.
@ Гидеон - рад, что кто-то это указал. Вот простой тест, который показывает драматическое влияние AndAlso:
Dim tm As New Stopwatch
Const tries As Integer = 123456
Dim z As Integer = 0
Dim s() As String = New String() {"0", "one"}
Debug.WriteLine("AndAlso")
For x As Integer = 0 To s.Length - 1
z = 0
tm.Restart() 'restart the stopwatch
For y As Integer = 0 To tries
If s(x) = x.ToString AndAlso s(x) = y.ToString Then '<<<<<<<<<<
z += 1
End If
Next
tm.Stop()
Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
Next
Debug.WriteLine("And")
For x As Integer = 0 To s.Length - 1
z = 0
tm.Restart() 'restart the stopwatch
For y As Integer = 0 To tries
If s(x) = x.ToString And s(x) = y.ToString Then '<<<<<<<<<<
z += 1
End If
Next
tm.Stop()
Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
Next
Помимо короткого замыкания, упомянутого в других ответах, Or
/ And
можно использовать как побитовые операторы, где OrElse
/ AndAlso
нет. Побитовые операции включают объединение значений перечислений флагов, таких как перечисление FileAttributes , где вы можете указать, что файл является только для чтения и скрыт FileAttributes.ReadOnly Or FileAttributes.Hidden