我正在为多行字符串模式创建正则表达式,但它不起作用。这是我的输入模式。
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: -
答案 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))
每次下一个字符为数字时,这将分割您的数据。