我正在尝试从SQL计算字符串中提取所有列名称。 数据保存在数据表的单元格中,并由列周围的方括号确定。 我可以提取[*]的每个实例,但是刚刚注意到我遇到了问题。一些列具有表名,而另一些具有模式和表名。 例如。 [column] [table] .column]或[schema]。[table]。[column] 我如何修改此代码,以将第一个“ [”和最后一个“]”之间的所有内容拉到句号之间?
以下代码填充datatable1,然后通读以查找包含列名([*])的任何“ column_calculation_formula”单元,并将其添加到该行的副本中,以准备上载到新的数据表中。 我尝试将新行追加到数据表中,但这会引起问题。
DataTable WBC_DTable = PopulateDataTable();
DataTable WBC_DTable2 = new DTSetup.WBDataTablesSetup().WBDSColumnsSetup();
Regex regex = new Regex(@"\[(.*?)\]");
long Rows = WBC_DTable.Rows.Count;
foreach (DataRow row in WBC_DTable.Rows)
{
string InputString = row["column_calculation_formula"].ToString();
MatchCollection matches = regex.Matches(InputString);
List<string> Output = new List<string>();
foreach (Match m in matches)
{
Output.Add(m.Value);
TextBoxAppend("Before: " + m.Value);
}
List<string> distinct = Output.Distinct().ToList();
foreach (string value in distinct)
{
TextBoxAppend("After: " + value);
if (distinct.Count() > 0)
{
DataRow NewRow = WBC_DTable2.NewRow();
NewRow.ItemArray = row.ItemArray;
NewRow["column_datatype"] = "SubColumn";
NewRow["column_name"] = value;
WBC_DTable2.Rows.Add(NewRow);
}
}
DataRow NewRow2 = WBC_DTable2.NewRow();
NewRow2.ItemArray = row.ItemArray;
WBC_DTable2.Rows.Add(NewRow2);
}
完全有信心这应该是Regex调用的一种更改,但是我对Regex的了解还不足以做到这一点。
任何帮助将不胜感激。
答案 0 :(得分:2)
您可以使用
var res = Regex.Matches(s, @"\[.*?](?!\.)")
.Cast<Match>().
Select(x => x.Value)
.ToList()
docs。
详细信息
\[
-文字[
.*?
-除换行符外的任何0+个字符,应尽可能少](?!\.)
-一个]
字符,不能立即跟一个.
。