2011-05-05 65 views
0

我需要每一个X之后插入一个词在给定的文本(即4,5,6等)句子后面添加一个字。我觉得正则表达式会是紧凑和好的解决方案。具体而言,我需要在.net中执行此操作。正则表达式 - 每X句子

感谢,

米希尔

(如果正则表达式不能找出一些句子不常用的标点结束,我与它的罚款。我并不需要100%的准确率)

+1

我不认为正则表达式是善于识别句子:认为所有的边缘情况下,像首字母缩写。事实上,识别句子是相当不重要的。只有在这里使用正则表达式,如果你不需要100%的准确性。 – 2011-05-05 08:01:40

回答

1

如果你发现通过字符串匹配和循环只能用正则表达式做它在.NET只要你找到新的匹配。当然,这是没有正则表达式中的实现:

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中实现它,虽然还有其他一些方式来做到这一点。

+0

这是C#代码,但你可以将其转换为VB.NET,如果你能为你的代码中使用它。 – 2011-05-05 09:24:48

+0

thnx。我做了一些修改,结果就像我想的那样,在X语句之后插入一些单词,其中X是4到8之间的随机数。 – Mihir 2011-05-05 15:51:53

0

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

+0

我同意,这不是正则表达式的地方。但是,对于美国或S.O.S.等缩略词,您必须小心。我建议遍历整个字符串,只计算大于几个字符的时间间隔。 – 2011-05-05 08:27:53

1

扩展正则表达式时支持word 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