2017-04-03 272 views
1

目前(使用C#)我使用字符串方法INSTR子串插入到部分数字放入一个字符串。即使该方法工作正常,但它非常混乱,并且不易管理,因为在后台还有其他内容需要扩展时。 我想知道是否可以使用正则表达式插入节号而不是使用标准字符串方法?如果是这样,它是如何完成的?使用正则表达式插入序列编号

例如:

原始字符串

快速赤狐。跳过懒狗?快速的红狐狸! “跳过”这只懒狗。如果使用正则表达式

1)所述的快速红色狐

输出。 2)跳过懒惰的狗? 3)快速红色 狐狸! “4)跳过”懒狗。

PS:这是当前的方法我用无正则表达式:

public string[] ApplyContentNumbering(string[] lines) 
{ 
    int count = 1; 
    if (lines != null && lines.Length > 0) 
    { 
     lines[0] = String.Format("{0} {1}", Chapter, lines[0].Substring(0)); 
     bool isOpen = false; 

     for (int index = 1; index < lines.Length; index++) 
     { 
      count++; 
      lines[index] = String.Format("{0} {1}", count, lines[index].Substring(0)); 

      if (lines[index].IndexOf("\"") > 0) 
      { 
       for (int c = 0; c < lines[index].Length; c++) 
       { 
        if (lines[index].Substring(c, 1).Equals("\"")) 
        { 
         if (isOpen == false) 
         { 
          count++; 
          lines[index] = lines[index].Insert(c + 1, String.Format("{0}", count)); 
          isOpen = true; 
         } 
         else 
         { 
          isOpen = false; 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

有什么要求?何时插入号码? –

+0

Hi Wiktor,我想在每个句子的开头和每个语音标记的开头添加编号,因此序号不断递增。 – Overdrive77

+0

我不确定正则表达式是否正确。我相信代码可以从一些重构中受益,因为我无法一眼就看出它的工作原理。将一些功能分离成独立于此特定方法的方法。比如将句子排成一行的方法。然后另一种插入序列的方法等。 –

回答

2

您可以在此使用近似(或“足够好”)的方式,将包括在加入递增字符串/标点符号后面的数字,以及1个空格后跟大写字母。

这里是一个C# demo

var pat = @"(^|\p{P}\s+)(""?\p{Lu})"; 
var s = "The quick red fox. Jumped over the lazy dog? The quick red fox! \"Jumped over\" the lazy dog."; 
var cnt = 0; 
var res = Regex.Replace(s, pat, m => 
     string.Format("{0}{1}) {2}", m.Groups[1].Value, ++cnt, m.Groups[2].Value)); 
Console.WriteLine(res); 
// => 1) The quick red fox. 2) Jumped over the lazy dog? 3) The quick red fox! 4) "Jumped over" the lazy dog. 

正则表达式 - (^|\p{P}\s+)("?\p{Lu}) - 匹配:

  • (^|\p{P}\s+) - 组字符串或标点符号的1个拍摄开始和1+空格
  • ("?\p{Lu}) - 组2捕获可选的",然后输入一个大写字母。

要以更可靠的方式将文本切分为句子,最好使用一些NLP包。

+1

啊,你用linq来做替换,那很好!我从来没有想过你可以做到这一点。谢谢! – Overdrive77