我需要将一个像“一。二。三。四。五。六。七。八。九。十一。十一”的字符串匹配成四个句子的组。我需要一个正则表达式,在每四个句点后将字符串分成一个组。类似的东西:
string regex = @"(.*.\s){4}";
System.Text.RegularExpressions.Regex exp = new System.Text.RegularExpressions.Regex(regex);
string result = exp.Replace(toTest, ".\n");
不起作用,因为它将替换句点之前的文本,而不仅仅是句点本身。我如何只统计句点并用句点和换行符替换它们?
答案 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)
}