5

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

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

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

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

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

4

6 回答 6

2

.在正则表达式中表示“任何字符”

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

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

于 2008-10-28T21:36:56.027 回答
1

尝试定义方法

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

并使用

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

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


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

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

另一个编辑:修复了正则表达式,希望这次我做对了。

于 2008-10-28T21:33:58.340 回答
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}"排列方式,但捕获只会捕获最后一次出现(即单词),因此在替换时,您将丢失 4 个单词中的 3 个。如果我错了,请有人纠正我。

于 2008-10-28T21:38:57.473 回答
0

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

于 2008-10-28T21:39:43.587 回答
0

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

string regex = @"([^.]*[.]){4}\s*";
于 2008-10-29T02:27:05.067 回答
-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)
}
于 2008-10-28T21:43:45.950 回答