Директивы препроцессору VB.NET

Идти вперед и понимать мысль там, вместо того, чтобы неоднократно использовать их:

[A-Za-z0-9 _]
[A-Za-z0-9]

я имею два (надо надеяться, лучше) замены для тех двух:

[\w ]
[^\W_]

первый соответствует любому словесному символу (алфавитно-цифровой и _, а также Unicode) и пространство. Вторые соответствия что-либо, что не несловесный символ или подчеркивание (алфавитно-цифровой только, а также Unicode).

, Если Вы не хотите соответствие Unicode, затем придерживайтесь других ответов. Но они просто выглядят легче на глазах (по-моему). При взятии "предпочтительного" ответа с этой записи и использования короче regexes дает нам:

^[\w ]*[^\W_][\w ]*$

, Возможно, более читаемый, возможно, меньше. Конечно, короче. Ваш выбор.

РЕДАКТИРОВАНИЕ:

Так же, как примечание, я принимаю стиль Perl regexes здесь. Ваш regex механизм может или не может поддерживать вещи как \w и \W.

РЕДАКТИРОВАНИЕ 2:

шахта Tested с JS regex тестер, что кто-то связанный с и некоторые основные примеры хорошо работал. Не сделал ничего обширного, просто требуемого, чтобы удостовериться, что \w и \W хорошо работали в JS.

РЕДАКТИРОВАНИЕ 3:

попытавшийся протестировать некоторый Unicode с JS regex сайт тестера, я обнаружил проблему: та страница использует ISO вместо Unicode. Неудивительный мой японский вход не соответствовал. О, хорошо это не должно быть трудно зафиксировать:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Или около этого. Я не знаю то, что должно быть сделано до JavaScript, но я уверен, что это не твердо.

14
задан Mark Brackett 2 October 2009 в 19:02
поделиться

1 ответ

Turns out, it's not all of VB.NET that's broken - just the CodeDomProvider (which both ASP.NET and Snippet Compiler use).

Given a simple source file:

Imports System
Public Module Module1
    Sub Main()
       #If DEBUG Then
          Console.WriteLine("Debug!")
       #End If

       #If Not DEBUG Then
          Console.WriteLine("Not Debug!")
       #End If
    End Sub
End Module

Compiling with vbc.exe version 9.0.30729.1 (.NET FX 3.5):

> vbc.exe default.vb /out:out.exe
> out.exe
  Not Debug!

That makes sense...I didn't define DEBUG, so it shows "Not Debug!".

> vbc.exe default.vb /out:out.exe /debug:full
> out.exe
  Not Debug!

And, using CodeDomProvider:

Using p = CodeDomProvider.CreateProvider("VisualBasic")
   Dim params As New CompilerParameters() With { _
      .GenerateExecutable = True, _
      .OutputAssembly = "out.exe" _
   }
   p.CompileAssemblyFromFile(params, "Default.vb")
End Using

> out.exe
Not Debug!

Okay, again - that makes sense. I didn't define DEBUG, so it shows "Not Debug". But, what if I include debug symbols?

Using p = CodeDomProvider.CreateProvider("VisualBasic")
   Dim params As New CompilerParameters() With { _
      .IncludeDebugInformation = True, _
      .GenerateExecutable = True, _
      .OutputAssembly = "C:\Users\brackett\Desktop\out.exe" _
   }
   p.CompileAssemblyFromFile(params, "Default.vb")
End Using

> out.exe
Debug!
Not Debug!

Hmm...I didn't define DEBUG, but maybe it defined it for me? But if it did, it must have defined it as "1" - because I can't get that behavior with any other value. ASP.NET, using the CodeDomProvider, must define it the same way.

Looks like the CodeDomProvider is tripping over VB.NET's stupid psuedo-logical operators.

Moral of the story? #If Not is not a good idea for VB.NET.


And now that source is available, I can verify that it does actually set it equal to 1 as I expected:

if (options.IncludeDebugInformation) {
      sb.Append("/D:DEBUG=1 ");
      sb.Append("/debug+ ");
}
10
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

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