使用正则表达式将字符串拆分为句子

时间:2008-10-28 21:22:34

标签: c# regex nlp

我需要将一个像“一。二。三。四。五。六。七。八。九。十一。十一”的字符串匹配成四个句子的组。我需要一个正则表达式,在每四个句点后将字符串分成一个组。类似的东西:

  string regex = @"(.*.\s){4}";

  System.Text.RegularExpressions.Regex exp = new System.Text.RegularExpressions.Regex(regex);

  string result = exp.Replace(toTest, ".\n");

不起作用,因为它将替换句点之前的文本,而不仅仅是句点本身。我如何只统计句点并用句点和换行符替换它们?

6 个答案:

答案 0 :(得分:2)

正则表达式中的

.表示“任何字符”

所以在你的正则表达式中,你使用了.*.来匹配一个单词(这相当于.+

您可能正在寻找[^.]\*[.] - 一系列不是“.”后跟“.”的字符。

答案 1 :(得分:1)

尝试定义方法

private string AppendNewLineToMatch(Match match) {
    return match.Value + Environment.NewLine;
}

并使用

string result = exp.Replace(toTest, AppendNewLineToMatch);

这应该为每个匹配调用方法,并用该方法的结果替换它。方法的结果将是匹配的文本和换行符。


编辑:另外,我同意奥利弗的观点。正确的正则表达式定义应该是:

  string regex = @"([^.]*[.]\s*){4}";

另一个编辑:修正了正则表达式,希望这次我把它弄好了。

答案 2 :(得分:0)

搜索表达式:@"(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)" 替换表达式:"$1 $2 $3 $4.\n"

我在RegexBuddy中运行了这个表达式并选择了.NET正则表达式,输出为:

one two three four.
five six seven eight.
nine. ten. eleven

我尝试使用@"(?:([^.]+?).\s){4}"类型的排列,但捕获只会捕获最后一次出现(即单词),因此在更换时,您将失去3个单词。请有人纠正我如果我错了。

答案 3 :(得分:0)

您是否被迫通过正则表达式执行此操作?分割字符串然后处理数组会不会更容易?

答案 4 :(得分:0)

我不确定编辑器的答案是否被编辑器破坏了什么,但它不起作用。 正确的模式是

string regex = @"([^.]*[.]){4}\s*";

答案 5 :(得分:-1)

在这种情况下,似乎正则表达式有点矫枉过正。我建议使用String.split,然后分解生成的字符串数组。它应该比试图让正则表达式做你想要做的更简单,更可靠。

这样的事情可能更容易阅读和调试。

String s = "one. two. three. four. five. six. seven. eight. nine. ten. eleven"
String[] splitString = s.split(".")
List li = new ArrayList(splitString.length/2)
for(int i=0;i<splitString.length;i+=4) {
    st = splitString[i]+"."
    st += splitString[i+1]+"."
    st += splitString[i+2]+"."
    st += splitString[i+3]+"."
    li.add(st)
}