【问题标题】:Regular expression couldn't match text when there is line break within it当文本中有换行符时,正则表达式无法匹配文本
【发布时间】:2017-04-26 18:55:17
【问题描述】:

我正在尝试基于正则表达式提取字符串,但是当字符串中存在新行时.. 正则表达式无法处理

正则表达式 -

^Test\s[0-9]-[0-9]:.+?(?=\.)

表达式很简单,它匹配任何以 Test 开头的字符串,后跟空格和数字, : 后跟任何文本,直到 .

这会找到如下文本消息

Test 1-8: This is first test.
Test 9-8: This is second test and is OK.
Test 5-1:This is Test 1,3 three.

但是当下面有一个换行符的文本时,上面的正则表达式不起作用。

Test 9-8: This is second test 
and is OK.

我应该如何在我的正则表达式中处理这个问题?

【问题讨论】:

  • 您通常必须启用多行,这取决于应用程序 - 将您使用的内容添加到您的问题中。
  • regexr.com .. 在这里尝试添加您的正则表达式和字符串并自己尝试
  • 对于@RïshïKêshKümar 给出的示例,您在右上角的“标志”按钮中激活换行符。

标签: regex


【解决方案1】:

.(在 .+?(?=\.) 中使用)与非 POSIX 正则表达式引擎中的换行符不匹配(确切的字符因正则表达式库而异)。

在这里使用否定字符类[^.]+

^Test\s[0-9]-[0-9]:[^.]+

regex demo

[^.]+ 匹配除文字点之外的任何 1 个或多个字符(包括换行符)。

【讨论】:

  • 有许多正则表达式的实现,默认情况下正则表达式匹配是每行的——除了你提到的前瞻性之外,它真的取决于应用程序。
  • @kabanus:我的意思是.+?(?=\.) 不会匹配换行符,但[^.] 匹配相同的文本,但跨行。暂时用在工具还是代码中都无关紧要。
  • 感谢 Wiktor .. 请检查regex101.com/r/lBHNGG/1 .. 如何在正则表达式中处理以匹配其中的前两条消息?
  • 使用^Test\s[0-9]-[0-9][0-8]?:[^.]+,在[0-8] 之后添加? 使其匹配1 或0 次。
【解决方案2】:

要匹配“任何字符,包括换行符”,您可以使用以下内容:[\s\S],这意味着“任何空白字符和任何非空白字符”......非常有效:一切。

您也可以使用“s”标志:/^Test\s[0-9]-[0-9]:.+?(?=\.)/s。这还将包括点的换行符。

@wiktor-stribiżew 提供的解决方案更有效,所以我建议使用该解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2021-02-14
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多