我有基于.net regex函数的SQL CLR函数,以便通过正则表达式拆分值。在其中一个案例中,我使用函数将值分割为|
。问题是我发现其中一个值有两倍||
。因为,我确信第二个值(右值)是一个数字,我知道第二个|
是第一个值(左值)的一部分。
我有:
慂||2215
应该拆分为:
慂|
2215
我正在使用此表达式[|]
进行拆分。我认为为了使其有效,我需要使用Zero-width negative look ahead assertion.
,但当我按(?![|])[|]
分割时,我得到:
慂||2215
如果我试着看后面 - (?<![|])[|]
我得到:
慂
|2215
但我需要管道成为第一个值的一部分。
有人可以帮我吗?仅寻找正则表达式解决方案,因为现在无法更改应用程序。
如果有人需要,这是函数:
/// <summary>
/// Splits an input string into an array of substrings at the positions defined by a regular expression pattern.
/// Index of each value is returned.
/// </summary>
/// <param name="sqlInput">The source material</param>
/// <param name="sqlPattern">How to parse the source material</param>
/// <returns></returns>
[SqlFunction(FillRowMethodName = "FillRowForSplitWithOrder")]
public static IEnumerable SplitWithOrder(SqlString sqlInput, SqlString sqlPattern)
{
string[] substrings;
List<Tuple<SqlInt64, SqlString>> values = new List<Tuple<SqlInt64, SqlString>>(); ;
if (sqlInput.IsNull || sqlPattern.IsNull)
{
substrings = new string[0];
}
else
{
substrings = Regex.Split(sqlInput.Value, sqlPattern.Value);
}
for (int index = 0; index < substrings.Length; index++)
{
values.Add(new Tuple<SqlInt64, SqlString>(new SqlInt64(index), new SqlString(substrings[index])));
}
return values;
}
答案 0 :(得分:4)
你应该在这里使用负面预测,而不是使用lookbehind
[|](?![|])
请参阅regex demo
<强>详情
[|]
- 匹配|
字符(?![|])
- 在当前位置右侧不需要|
字符的否定前瞻。