C#RegEx不返回应该的内容

时间:2013-09-12 08:02:55

标签: c# .net regex

我得到了这个正则表达式问题,我需要选择字符串的最后一部分但是无论我做什么它只会选择直到它命中为“\ n”(换行符) 这是我到目前为止所尝试的内容

sms = Regex.Match(datalog, "\"\\r\\n.*").ToString();

或者

sms = Regex.Match(datalog, @"\""\r\n.*").ToString();

这是数据记录包含的内容

"\r\n+CMT: \"+4528835769\",,\"13/09/11,15:09:32+08\"\r\nLinje 1\nLinje2\nLinje 3\r\n

我需要Rexex返回

"\r\nLinje 1\nLinje2\nLinje 3\r\n

但这是它返回的内容(以及字符串sms最终包含的内容)

"\"\r\nLinje 1"

我做错了什么? 因为它在Linje 1\n之后停止选择我认为问题出在换行符上。

我也尝试使用.+代替.*,但结果是相同的

编辑:我发现它很简单:

sms = Regex.Match(datalog, @"\""\r\n.*", RegexOptions.Singleline).ToString();

4 个答案:

答案 0 :(得分:1)

句点(.)默认情况下与新行不匹配。您需要通过指定RegexOptions.SingleLine来启用此行为。

  

点匹配单个字符,而不关心那个字符   是。唯一的例外是换行符。在所有正则表达的味道   在本教程中讨论过,点与新行字符不匹配   默认情况下。因此,默认情况下,点是否定字符的缩写   class [^ \ n](UNIX正则表达式)或[^ \ r \ n](Windows正则表达式)。

     

...

     

这里讨论的所有正则表达式都有一个选项可以使点匹配   所有字符,包括换行符。在RegexBuddy,EditPad Pro或   PowerGREP,您只需勾选标有“dot matches newline”的复选框。

     

...

     

使用.NET框架的正则表达式类时,通过指定>激活此模式。 RegexOptions.Singleline,例如Regex.Match(“string”,“regex”,RegexOptions.Singleline)。

来源:http://www.regular-expressions.info/dot.html

答案 1 :(得分:1)

将方法调用更改为...

sms = Regex.Match(datalog, @"\""\r\n.*", RegexOptions.MultilineMode);

多线模式忽略换行符,回车等等。

MSDN - Multiline Mode

的更多详情

答案 2 :(得分:0)

Regex中有一个选项可以使用多线模式。这是一个例子:

http://www.dotnetperls.com/regexoptions-multiline

答案 3 :(得分:0)

您可以将正则表达式行更改为

sms = Regex.Match(datalog, "(?<=\"\\r\\n).*", RegexOptions.Singleline).ToString();

(?<=...)从报告的匹配项中排除该组,因此它以“Linje 1”开头。如果你需要,你可以恢复原来的正则表达式。

RegexOptions.Singleline更改.以匹配换行符/返回。