1

我正在实现一个模糊查找工具,我认为我可以通过将单独的首字母折叠成一个标记来改善结果,例如“ABC Warehouse”变成了两个标记:“ABC”和“Warehouse”。

换句话说,它需要删除所有连续的独立字母数字对之间的空格(或句点)。所以这些会凝结...

  • ABC仓库
  • ABC仓库

但这些不会...

  • AB C 仓库
  • BC 仓库

我的第一个预感是使用正则表达式替换,这自然意味着我现在有两个问题而不是一个。这大致是我尝试过的,它不起作用。这是调用函数的 T-SQL 代码,该函数只是 .Net 的 Regex 方法的包装器。

它将“A B”凝聚成“AB”,然后取消“C”凝聚成对“AB”的资格,从而产生“AB C Warehouse”。(至少我认为这是正在发生的事情;我不是正则表达式内部的专家。)

master.dbo.RegexReplace(
    'A B C Warehouse',
    '(?<c1>(^|[^a-z0-9])[a-z0-9])[ \.](?<c2>[a-z0-9]([^a-z0-9]|$))',
    '${c1}${c2}',
    0 /*Case-sensitivity flag*/
)

我什至应该用正则表达式做这种事情,还是只编写一个对输入字符串进行有状态扫描并清理它的例程会更有意义?

4

1 回答 1

4

试试这个替换:

find: (?<=\b[A-Z])[ .](?=[A-Z]\b)
replacement is an empty string.

解释:

模式搜索空间或点,前面有一个字母,后面有一个字母。这就是为什么它使用后视(?<=...)和前瞻(?=...)来测试点或空格周围是否存在单个字母。这里使用单词边界\b来确保字母,之前和之后,是单独的。由于环视不吃字符,因此仅匹配(和替换)空格或点。

于 2013-05-16T16:16:13.913 回答