You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式含变量时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:03:29