Идти вперед и понимать мысль там, вместо того, чтобы неоднократно использовать их:
[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, но я уверен, что это не твердо.
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+ ");
}