Как проверить, не существует ли значение в массиве? [Дубликат]

Хотя ответы, которые вы не можете проанализировать HTML с регулярными выражениями, верны, они не применяются здесь. OP просто хочет проанализировать один тег HTML с регулярными выражениями, и это то, что можно сделать с помощью регулярного выражения.

Предлагаемое регулярное выражение неверно:

<([a-z]+) *[^/]*?>

Если вы добавите что-то в регулярное выражение, путем обратного отслеживания его можно заставить сопоставить такие глупые вещи, как <a >>, [^/] слишком разрешительно. Также обратите внимание, что <space>*[^/]* является избыточным, поскольку [^/]* также может соответствовать пробелам.

Мое предложение было бы

<([a-z]+)[^>]*(?<!/)>

Где (?<! ... ) (в Perl-регулярных выражениях) отрицательный внешний вид. Он читает «a», затем слово, а затем все, что не является>, последнее из которых не может быть /, а затем> «.

Обратите внимание, что это позволяет такие вещи, как <a/ > ( как и исходное регулярное выражение), поэтому, если вы хотите что-то более ограничительное, вам нужно создать регулярное выражение для соответствия парам атрибутов, разделенных пробелами.

43
задан Visual Vincent 23 January 2017 в 08:51
поделиться

4 ответа

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 Исключение, созданное в первом выражении, предотвратит второе выражение от оценки, но это вряд ли удивительно.

66
ответ дан user 15 August 2018 в 21:00
поделиться

Разница в том, что OrElse и AndAlso будут замыкаться на короткое замыкание на основе первого условия, что означает, что если первое условие не пройдет, второе (или более) условие не будет оценено. Это особенно полезно, когда одно из условий может быть более интенсивным, чем другое.

Пример, где Or является точным (оба условия оцениваются):

If Name = "Fred" Or Name = "Sam" Then

Это действительно doesn «независимо от того, каким образом они оцениваются

. Следующая AndAlso полезна, потому что второе условие может потерпеть неудачу

If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then

Это позволяет первому условию проверить, является ли объект был установлен, и только если он был установлен, пойдет и проверит базу данных (или другую задачу). Если это было простое ключевое слово And, оба будут оцениваться.

4
ответ дан davidsleeps 15 August 2018 в 21:00
поделиться

@ Гидеон - рад, что кто-то это указал. Вот простой тест, который показывает драматическое влияние 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
2
ответ дан dbasnett 15 August 2018 в 21:00
поделиться

Помимо короткого замыкания, упомянутого в других ответах, Or / And можно использовать как побитовые операторы, где OrElse / AndAlso нет. Побитовые операции включают объединение значений перечислений флагов, таких как перечисление FileAttributes , где вы можете указать, что файл является только для чтения и скрыт FileAttributes.ReadOnly Or FileAttributes.Hidden

10
ответ дан Gideon Engelberth 15 August 2018 в 21:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: