【问题标题】:Cutting text to specific length preserving the words将文本切割成特定长度,保留单词
【发布时间】:2015-05-12 00:06:07
【问题描述】:

我有以下文字:

测试一些文本。现在这里有一些新的 realylonglonglong 文本

我需要把它剪成 50 个字符,但不要剪掉单词。所以,期望的结果是:

测试一些文本。现在这里有一些新的......

我只寻找使用正则表达式替换的解决方案。以下正则表达式:

^.{0,50}(?= |$)

匹配:

测试一些文本。现在这里有一些新的

但我未能将其转换为用于替换功能。


在我的真实案例中,我有一个名为 [dbo].[RegexReplace] 的 SQL CLR 函数,我这样称呼它:

SELECT [dbo].[RegexReplace](@TEST, '^.{0,50}(?= |$)', '...')

它的C#定义是:

        public static string Replace(SqlString sqlInput, SqlString sqlPattern, SqlString sqlReplacement)
        {
            string input = (sqlInput.IsNull) ? string.Empty : sqlInput.Value;
            string pattern = (sqlPattern.IsNull) ? string.Empty : sqlPattern.Value;
            string replacement = (sqlReplacement.IsNull) ? string.Empty : sqlReplacement.Value;
            return Regex.Replace(input, pattern, replacement);
        }

这就是我想用正则表达式替换功能的原因。

【问题讨论】:

    标签: c# regex tsql sql-server-2012 clr


    【解决方案1】:

    这是你想要的正则表达式:

    string result = Regex.Replace("Test some text. Now here is some new realylonglonglong text", "(?=.{50,})(^.{0,50}) .*", "$1...");
    

    所以寻找^(?=.{50,})(.{0,50}) .*并将其替换为$1...

    解释...您正在寻找至少 50 个字符长的文本,因为较短的文本不需要缩短,所以 (?=.{50,})(但请注意,这不会捕获任何内容)。然后查找前 0...50 个字符 (.{0,50}),然后是空格 ,然后是其他任何字符 .*。您将所有这些替换为前 0...50 个字符 ($1),然后是 ...

    我需要(?=.{50,}),否则正则表达式会将Test test 替换为Test...,从第一个空格开始替换。

    【讨论】:

    • 如果你对“测试一些文本。现在这里是一些新的非常非常长的文本”运行这个正则表达式,它会截断“非常”这个词。不确定这是否是 OP 的目的,但看起来他们已经接受了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多