0

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

FXP/R,U

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

正则表达式:

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

但这不是这条线:

3.NWAMNKPA/AMAJINDI NA 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 NA
  4. NWAMNKPA/ADAUGOAMAJI C
  5. NWAMNKPA/CHINAZAEKPERE N
4

2 回答 2

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))

每次下一个字符是数字时,这都会拆分您的数据。

于 2013-05-13T14:58:49.777 回答
0

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

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

于 2013-05-13T14:55:57.740 回答