正则表达式按最后一个索引分割

时间:2018-04-12 12:47:22

标签: c# .net sql-server regex sql-server-2016-sp1

我有基于.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;
}

1 个答案:

答案 0 :(得分:4)

你应该在这里使用负面预测,而不是使用lookbehind

[|](?![|])

请参阅regex demo

<强>详情

  • [|] - 匹配|字符
  • (?![|]) - 在当前位置右侧不需要|字符的否定前瞻。

enter image description here