用于多行字符串模式的正则表达式

时间:2013-05-13 14:17:19

标签: c# regex

我正在为多行字符串模式创建正则表达式,但它不起作用。这是我的输入模式。

  

FXP / R,U

     

1.NWAMNKPA / UGONMA D 2.NWAMNKPA / AMAJINDI O
     3.NWAMNKPA / AMAJINDI N A 4.NWAMNKPA / ADAUGOAMAJI C
     5.NWAMNKPA / CHINAZAEKPERE N

正则表达式:

  

(FXP \ S {3,20})|(。\ r \ S {3} \ S +(+))

但不是这一行:

  

3.NWAMNKPA / AMAJINDI N A 4.NWAMNKPA / ADAUGOAMAJI C

只需要这两个:

  

1.NWAMNKPA / UGONMA D 2.NWAMNKPA / AMAJINDI O
  5.NWAMNKPA / CHINAZAEKPERE N

所需的o / p: -

  1. NWAMNKPA / UGONMA D
  2. NWAMNKPA / AMAJINDI O
  3. NWAMNKPA / AMAJINDI N A
  4. NWAMNKPA / ADAUGOAMAJI C
  5. NWAMNKPA / CHINAZAEKPERE N

2 个答案:

答案 0 :(得分:0)

您可以查看RegexOptions.MultiLine(以及其他选项)。 (http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx

我建议你改用String.Split()并一次验证一行。正则表达式难以读取,不需要在更多行上匹配模式。它使您的代码更容易理解。

答案 1 :(得分:0)

我不认为你的正则表达式正在做你认为它正在做的事情。第一部分是好的,但第二部分\r\s{3}.\S+(.+)正在寻找一个回车符,后面跟着正好三个空白字符,后跟任意一个字符(空格或不空格),后跟任意数量的非空格字符,后跟您捕获的任意数量的字符。

这有很多问题。首先,并非所有文本都有回车符(\r) - 检查换行符(\n)反而更加安全。即使您的文字确实有\r,之后几乎肯定会有\n(Windows结束\r\n行。 \n可能会被\s{3}吸收,具体取决于您的数据。

其次,+是一个贪婪的运算符。这意味着+中的第一个\S+(.+)将匹配所有内容 - 换句话说,所有非空白字符,直到它到达空白。只有找到空格后,(.+)才会开始捕获,而它拥有的第一个字符将是空格。或者,如果字符串中没有剩余空格,\S+将“返回”一个字符,以便.+具有匹配的内容,在这种情况下,它将只是该字符的最后一个字符。字符串。

考虑到所有事情,我认为你会因为更简单的事情而变得更好,比如:

RegEx.Split(myData, @"(?=\d)").Where(s => !string.IsNullOrEmpty(s))

每次下一个字符为数字时,这将分割您的数据。