【问题标题】:Regex for newline "\n\r" and digits换行符“\n\r”和数字的正则表达式
【发布时间】:2021-12-26 09:00:32
【问题描述】:

我要匹配\r\n1.1

blabla \r\n1.1 Entrepreneurship und Untern

我尝试了以下正则表达式:

"\r\n"\d\.\d\s+

它应该是什么样子?

链接:https://regex101.com/r/wwN9SR/1

【问题讨论】:

  • \\r\\n\d.\d\s+?..
  • 谢谢。另外:我想匹配\r\n1.11.1 Entrepreneurship und Unternehmer\r\n ``` blabla \r\n1.11.1 Entrepreneurship und Unternehmer\r\nEs ``` 我尝试了以下正则表达式:``` \\r\\n\d.\d\ d.\d\s+\w\\r\\n ```它应该是什么样子的?链接:regex101.com/r/QNXniB/1
  • @Gserg 实际上是相反的削减;正则表达式将 CR LF 作为实际的 CR LF 字符没有问题,但编译器不会将 \d 视为无法识别的转义序列
  • 使用\\r\\n\d+[\.\d+]*\s+ 应该找到所有需要的序列\r\n1.1\r\n1.11.1\r\n12.11.1
  • 在我看来,当您尝试匹配 1. 时,匹配点 . 字符的内容有误。它不是.,而是\.

标签: c# regex


【解决方案1】:

它应该是什么样子?

如果您的字符串包含回车和换行符

如果你在bla \r\n1.1这样的帖子中说,你的意思是这个字符串有一个回车符和一个换行符,总共9个字符,那么你可以:

Regex.Match("blabla \r\n1.1 Entrepreneurship und Untern", "\r\n\\d\\.\\d\\s+");

(您不需要\\r\\n,因为正则表达式引擎可以接收 CR LF 作为编译器解释 \r 和 \n 生成的实际字符,但编译器不会感谢您将 \d 和\s 在非逐字字符串中,因为这些不是编译器可以处理的已知转义序列)

或者

Regex.Match("blabla \r\n1.1 Entrepreneurship und Untern", @"\r\n\d\.\d\s+");

在第二种形式中,接收\r 并将其解释为“回车”的是正则表达式引擎,而不是编译器。使用@ 会关闭编译器将它看到的任何\r 转换为回车符(char 13)的过程。这意味着看到\r 并将其解释为“用户正在寻找回车符”的是正则表达式引擎


如果你的字符串包含斜杠、r、斜杠、n个字符

如果,当您在bla \r\n1.1 这样的帖子中说,您的意思是这个字符串实际上有一个斜线和一个 r,以及一个斜线和一个 n,总共 11 个字符,那么您可以:

Regex.Match(@"blabla \r\n1.1 Entrepreneurship und Untern", "\\\\r\\\\n\\d\\.\\d\\s+");

您需要输入\\\\r,因为编译器会将其转换为\\r,然后正则表达式引擎会将其转换为\r,即“斜杠后跟r”。

如果您刚刚执行\\\r,编译器会很高兴并变成“反斜杠后跟回车”,那么正则表达式引擎将寻找“反斜杠后跟回车”而不是“反斜杠后跟回车” r"

如果您刚刚执行\\r,编译器会将其转换为“反斜杠后跟 r”,但是当您“查找斜杠然后 r”时,正则表达式引擎会将其解释为“寻找回车符”

或者

Regex.Match("blabla \r\n1.1 Entrepreneurship und Untern",  @"\\r\\n\d\.\d\s");

出于同样的原因:使用 @ 字符串会停止编译器将 \\ 转换为 \\r 为(回车符),但您仍然需要正则表达式引擎执行类似的转换口译。您需要确保正则表达式引擎在其解释之前看到\\r。如果它看到\r 或(回车),它会在您查找“slash then r”时寻找回车


最后的脚注:当您开发 C# 正则表达式时,regexstorm.net 使用 .NET 正则表达式引擎,并且通常是比基于非 .NET 正则表达式引擎的站点更好的测试站点

【讨论】:

  • 感谢@cleptus - 没有看到对它的解释
【解决方案2】:

为了匹配

  • \r\n1
  • \r\n2.1
  • \r\n13.1.2

您应该转义 \. 字符,因为它们是保留字符正则表达式。要转义它们,请在它们之前添加一个 \ 字符,因此您的正则表达式应类似于:

\\r\\n(\d+\.?)+

在 ac# 字符串文字中使用该正则表达式时,您需要在字符串的开头添加一个 @ 字符以避免编译器解释 \ 字符(\ 字符不仅保留在正则表达式引擎,但也在 c# 字符串中)。

string myRegexExpression = @"\\r\\n(\d+\.?)+";

解释一下,因为正则表达式从来都不容易理解。

  • \\r\\n 匹配 \r\n 因为我们转义了 \ 字符
  • \d+ 匹配一个或多个数字
  • \.? 用于匹配可选的. 字符
  • (\d+\.?)+ 用于匹配重复的1. 序列,类似于11.11.1.1

【讨论】:

  • 我应该如何在blablsl \r\n1.11.1 Entrepreneurship und Unternehmer\r\n bla中匹配\r\n1.11.1 Entrepreneurship und Unternehmer\r\n
  • @te191fdsfa 不将其添加到答案中,因为它不是问题的一部分,而只是在评论中,但要匹配\r\n text\r\n,您可以使用捕获组( ),然后使用@ 987654347@ 告诉第一个捕获组的重复。应该类似于(\\r\\n)(\d+\.?)+ text\1
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 2019-04-17
相关资源
最近更新 更多