Лучшее многострочное выражение regex комментариев - это развернутая версия (?s)/\*.*?\*/
, которая выглядит как
String pat = "/\\*+[^*]*\\*+(?:[^/*][^*]*\\*+)*/";
См. пояснение в regex101.com .
Короче говоря,
/\*+
- сопоставить начало комментария, /*
и любые звездочки 0+ после него [^*]*\*+
- сопоставить 0+ символов, кроме *
, за которыми следуют 1+ литеральные *
(?:[^/*][^*]*\*+)*
- 0+ последовательности из: [^/*][^*]*\*+
- не /
или *
(совпадающие с [^/*]
), за которым следуют символы 0 + не звездочки ([^*]*
), за которыми следуют звездочки 1+ (\*+
) /
- закрытие /
regex Дэвида требует 26 шагов , чтобы найти совпадение в моей строке примера, а моему регулярному выражению требуется только 12 шагов . С огромными входами, регулярное выражение Дэвида, скорее всего, потерпит неудачу с проблемой переполнения стека или что-то подобное, потому что совпадение .*?
ленивых точек неэффективно из-за ленивого расширения шаблона в каждом месте, которое выполняет механизм регулярных выражений, в то время как мой шаблон соответствует линейным фрагментам текста в один раз.
Используйте хеш-таблицу:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$hash = [hashtable]::Synchronized(@{})
$hash.returnedVar = ""
Function Button_Click() {
[System.Windows.Forms.MessageBox]::Show("Button Clicked")
$returnedVariable = "The Returned Variable Worked"
Return $returnedVariable
}
Function Generate-Form {
# Build Form
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "My Form"
$Form.Size = New-Object System.Drawing.Size(200,200)
$Form.StartPosition = "CenterScreen"
$Form.Topmost = $True
# Add Button
$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(35,35)
$Button.Size = New-Object System.Drawing.Size(120,23)
$Button.Text = "Show Dialog Box"
$Form.Controls.Add($Button)
#Add Button event
$OutputVariableFromGenerateForm = $Button.Add_Click({$hash.returnedVar = Button_Click; [void]$form.Close(); [void]$form.Dispose(); })
# $returnedVar contains an array @("OK,"The Returned Variable Worked"),
# but it appears to be out of scope because it is in a script block.
# I only want "The Returned Variable Worked"
#Show the Form
[void]$form.ShowDialog()
$OutputVariableFromGenerateForm # This is OK
$hash.returnedVar # This is "The Returned Variable Worked"
} #End Function
Generate-Form