WEB开发网
开发学院数据库MSSQL Server SQL Server 2005: 正则表达式使模式匹配和数据提取... 阅读

SQL Server 2005: 正则表达式使模式匹配和数据提取变得更容易

 2009-02-10 10:20:07 来源:WEB开发网   
核心提示: Figure3匹配的表值 CLR UDF [SqlFunction( FillRowMethodName = "FillMatchRow",TableDefinition = "[Index] int,[Text] nvarchar(max)" )]

SQL Server 2005: 正则表达式使模式匹配和数据提取变得更容易Figure3匹配的表值 CLR UDF

[SqlFunction( FillRowMethodName = "FillMatchRow",
  TableDefinition = "[Index] int,[Text] nvarchar(max)" )]
public static IEnumerable RegexMatches(SqlChars input, SqlString pattern)
{
  return new MatchIterator( new string( input.Value ), pattern.Value );
}
[SuppressMessage( "Microsoft.Design", "CA1021:AvoidOutParameters" )]
public static void FillMatchRow( object data,
  out SqlInt32 index, out SqlChars text )
{
  MatchNode node = (MatchNode)data;
  index = new SqlInt32( node.Index );
  text = new SqlChars( node.Value.ToCharArray( ) );
}

对于 MatchIterator 的每个迭代,MatchNode 将被作为第一个参数传递到 FillMatchRow 方法。FillMatchRow 方法的其余参数必须声明为输出参数而且必须与第一个函数中定义的表定义匹配。FillMatchRow 函数仅使用 MatchNode 属性来填充字段数据。

最后,您可通过此函数从字符串轻松地提取多个数据片段。为了说明对 RegexMatches 函数的应用,让我们处理一个字符串以便使用此查询来确定其中包含多少个不同的单词:

declare @text nvarchar(max), @pattern nvarchar(max)
select
  @text = N'Here are four words.',
  @pattern = 'w+'
select count(distinct [Text])
  from dbo.RegexMatches( @text, @pattern )

此示例非常简单。不过它通过删除不同的关键字来显示使用此函数的某些可能性并且返回字符串的总字数。许多网站的文本输入限制似乎为任意长度的字符串。通过将此类测试与新的 nvarchar(max) 表示法相结合,它可以限制输入字数。此类查询可用于满足各种分析处理需求,而 RegexMatches 函数还可用于执行常见的任务。遗憾的是,此类查询还体现出对于使用正则表达式的过度热衷。此例中通过“w+”表达式完成的拆分操作可以恰好通过 String.Split 方法轻松地完成,那样速度会更快。正则表达式是一个非常强大的工具,但一定要确保有充分理由应用它们。可能存在用于特定情况的更简单且性能更佳的工具。

上一页  3 4 5 6 7 8 9 10  下一页

Tags:SQL Server 正则

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接