【问题标题】:Regex - Add a word after every X sentences正则表达式 - 在每 X 个句子后添加一个单词
【发布时间】:2011-05-05 07:57:23
【问题描述】:

我需要在给定文本中的每个 X(即 4、5、6 等)句子之后插入一个单词。我觉得正则表达式将是紧凑且良好的解决方案。具体来说,我需要在 .net 中执行此操作。

谢谢,

米希尔

(如果正则表达式无法识别某些以不常见的标点符号结尾的句子,我可以接受。我不需要 100% 的准确度)

【问题讨论】:

  • 我不认为正则表达式擅长识别句子:想想所有的边缘情况,比如首字母缩略词。事实上,识别句子是相当重要的。如果您不需要 100% 的准确率,请仅在此处使用正则表达式。

标签: .net regex vb.net


【解决方案1】:

您只能在 .NET 中使用 Regex 执行此操作,前提是您找到匹配项并在找到新匹配项时循环遍历字符串。当然,这不是纯正则表达式的实现:

string word = "WORD"; // Your word
string sentence = "1. 2. 3. 4. 5. 6. 7. 8. 9. 10."; // Your sentence
long count = 0;
int xSentence = 3; // Numbers of sentence
int pos = 0;

// Your Regex
Regex reg = new Regex(@"[\.,\!,\?]", RegexOptions.IgnoreCase);
Match mat = reg.Match(sentence);

// While there is a new match
while (mat.Success)
{
    count++;
    if (count % xSentence == 0)
    {
        // +1 to insert the word after punctuation
        pos = mat.Index + 1;

        sentence = sentence.Insert(pos, word);
        mat = reg.Match(sentence, pos);
    }
    else
    {
        mat = mat.NextMatch();
    }
}

也许这会帮助您在 .NET 中实现它,尽管还有其他几种方法可以做到这一点。

【讨论】:

  • 这是 C# 代码,但如果您可以将其用于您的代码,您可以将其转换为 VB.NET。
  • 谢谢。我做了一些修改,结果如我所愿,在 X 句后插入一些单词,其中 X 是 4 到 8 之间的随机数。
【解决方案2】:

扩展正则表达式支持单词boundary operator \b。它可以用来匹配句子的结尾。试试这个正则表达式:

((?:\.[^.]+){2})\b(\.)([ \n])

这是 2 和 3 的示例:

$ echo "A. B. C. D. E. F."|perl -wne 's/((?:\.[^.]+){1})\b(\.)([ \n])/$1$2word$3/g && print'
A. B.word C. D.word E. F.word
$ echo "A. B. C. D. E. F."|perl -wne 's/((?:\.[^.]+){2})\b(\.)([ \n])/$1$2word$3/g && print'
A. B. C.word D. E. F.word

【讨论】:

    【解决方案3】:

    如果我是你,我会做一个 string.Split(".") 这会给你一个数组,数组中的每个元素都包含一个句子。现在您可以将单词添加到您需要的任何句子的末尾。现在您可以使用 String.Join 将字符串连接在一起。注意:不要忘记添加“。”加入时返回

    【讨论】:

    • 我同意这不是 REGEX 的地方。但是,您必须小心使用 U.S.A. 或 S.O.S. 等首字母缩略词。我建议对整个字符串进行迭代,只计算彼此之间大于几个字符的周期。
    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多