正则表达式含变量时Controls.Find查找窗体控件失效求助
解决Controls.Find正则匹配失效的问题
嘿,我知道你现在卡在怎么用正则筛选特定名称的TextBox控件上了,咱们先搞清楚问题出在哪:
为什么你的原代码不工作?
Controls.Find()方法的第一个参数不支持直接传入正则表达式!它默认是按字面量或通配符来匹配控件名称的——你写的那段正则字符串会被当成普通文本去匹配控件名,自然找不到符合条件的控件。
正确的实现方式
咱们换个思路:先获取所有TextBox控件,再用PowerShell的正则匹配来筛选符合命名规则的。下面是具体代码:
# 假设你的目标前缀是$name,比如 $name = "IPTextBox" $name = "IPTextBox" # 先递归获取NetworkForm上所有的TextBox控件 $allTextBoxes = $NetworkForm.Controls.Find("TextBox", $true) | Where-Object { $_ -is [System.Windows.Forms.TextBox] } # 构建正则表达式:匹配以$name开头,后面跟一个或多个数字的控件名 $regexPattern = "^$([regex]::Escape($name))\d+$" # 筛选符合规则的TextBox $TextBoxes = $allTextBoxes | Where-Object { $_.Name -match $regexPattern }
正则表达式说明
^:锚定字符串的开头,确保控件名从$name开始[regex]::Escape($name):转义$name中的特殊字符(比如如果$name包含.或*这类正则元字符,会自动转义,避免匹配出错)\d+:匹配一个或多个数字(对应你要的IPTextBox1、IPTextBox2里的数字部分)$:锚定字符串的结尾,确保控件名除了$name和数字外没有其他内容
简化写法(直接遍历控件)
如果你不需要递归搜索子控件,也可以直接遍历顶层控件筛选:
$name = "IPTextBox" $regexPattern = "^$([regex]::Escape($name))\d+$" $TextBoxes = $NetworkForm.Controls | Where-Object { $_ -is [System.Windows.Forms.TextBox] -and $_.Name -match $regexPattern }
补充:如果想用通配符快速筛选
如果你对匹配精度要求不高,也可以用Controls.Find()的通配符功能快速匹配开头相同的控件,但这种方式会匹配所有以$name开头的控件(比如IPTextBoxABC也会被选中):
$TextBoxes = $NetworkForm.Controls.Find("$name*", $true) | Where-Object { $_ -is [System.Windows.Forms.TextBox] }
内容的提问来源于stack exchange,提问作者Nikita Kobtsev
相关产品推荐
相关产品推荐

