首页 > 解决方案 > 多个匹配的正则表达式

问题描述

我正在努力寻找一个匹配 SQL 语句中所有字段名的正则表达式,该语句分配给这样的字符串变量:

sqlText := "Select Nummer,"
sqlText += "Bez,"
sqlText += "Buchstabe,"
sqlText += "Maske,"
sqlText += "Zaehlkarte,"
sqlText += "Verteilart,"
sqlText += "Turnus,"
sqlText += "Verfart "
sqlText += "From AzStamm order by Nummer"

到目前为止我想出的是

Select\s+([A-Za-z]+), 

为模式。

我想要的是所有字段名称,例如 Nummer、Bez、Buchstabe 等。

我正在使用 PowerShell,但它也可能是 C#(或者可能是 Java 或 PHP):

[Regex]::Matches($sql, $Muster,[System.Text.RegularExpressions.RegexOptions]::Multiline)

我可能在模式中遗漏了一些东西(但我假设正则表达式默认是贪婪的)。

问候,彼得

标签: regexpowershell

解决方案


如果列名总是只包含字母,您可以使用:

select ((?:\p{L}+,\s*)*\p{L}+) from 

select...获取和之间以逗号分隔的名称列表from

$sqlText  = "Select Nummer,"
$sqlText += "Bez,"
$sqlText += "Buchstabe,"
$sqlText += "Maske,"
$sqlText += "Zaehlkarte,"
$sqlText += "Verteilart,"
$sqlText += "Turnus,"
$sqlText += "Verfart "
$sqlText += "From AzStamm order by Nummer"

if($sqlText -match 'select ((?:\p{L}+,\s*)*\p{L}+) from '){
  $ColumnNames = $Matches[1].Split(",") |ForEach-Object Trim
}
else{
  Write-Error "Couldn't extract column names"
}

$ColumnNames将是一个列名字符串数组


推荐阅读