2

我遇到了这个正则表达式问题,我需要选择字符串的最后一部分,但是无论我做什么,它只会选择直到它击中“\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

4 回答 4

1

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

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

...

此处讨论的所有正则表达式风格都可以选择使点匹配所有字符,包括换行符。在 RegexBuddy、EditPad Pro 或 PowerGREP 中,您只需勾选标记为“点匹配换行符”的复选框。

...

使用 .NET 框架的正则表达式类时,您可以通过指定 > RegexOptions.Singleline 来激活此模式,例如在 Regex.Match("string", "regex", RegexOptions.Singleline) 中。

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

于 2013-09-12T08:12:55.687 回答
1

将您的方法调用更改为...

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

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

MSDN上的更多详细信息- 多行模式

于 2013-09-12T08:17:17.873 回答
0

Regex在使用多行模式中有一个选项。这是一个例子:

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

于 2013-09-12T08:11:59.817 回答
0

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

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

从报告的(?<=...)匹配中排除该组,使其以“Linje 1”开头。如果您确实需要,您可以恢复到原来的正则表达式。

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

于 2013-09-12T08:26:27.223 回答