捕获包含“。”的行。或“:”但不以句号结尾

时间:2011-02-14 11:44:57

标签: php regex character-encoding

我正在尝试创建一个包含字符集的正则表达式,该字符集可以包含句点或冒号,但可能不以句点结尾。所以我想说一句话"Lorem./: Ipsom dolor sit"而不是"Lorem ipsum dolor sit."

这是我目前的正则表达式的样子,但它不起作用,因为如果字符串以句点或冒号结束它将匹配:

/(\n{2,})([ \wåäöÅÄÖ,()%+\-:.]{2,75}[^.:])(\n{1,})/

我正在寻找一个巨大的,格式错误的纯文本文件中的标题。此文件中的一般模式是标题始终以两个或更多的换行符开头,并且总是由一个换行符或更多换行符。此外,标题有时会在:上结束,但永远不会在.上结束,但它们有时会包含.:。它们总是长2-75个字符,前面没有另一个标题。

非常感谢任何帮助。

编辑:我意识到我的解释非常糟糕且部分错误,因此更新了这篇文章。

3 个答案:

答案 0 :(得分:3)

通常,如果要匹配不以点结尾的字符串,只需将(?<!\.)$添加到正则表达式的末尾。

这是negative lookbehind assertion

在你的特殊情况下,匹配应该在此之后继续,所以我们需要一个不同的方法:

/\n{2,}([ \wåäöÅÄÖ,()%+\-:.]{2,75}(?<!\.))\n+/

将匹配任何

  • 遵循两个或更多新行(\n{2,}),
  • 仅包含2到75个允许的字符([ \wåäöÅÄÖ,()%+\-:.]),
  • 不会以.(?<!\.) - )
  • 结尾
  • ,后跟至少一个换行符(\n+)。

修改

一个新的,扩展的正则表达式,试图结合下面评论中讨论的一些逻辑;格式化为详细的正则表达式:

preg_match_all(
    '/(?<=\n\n)   # Assert that there are two newlines before the current position
    ^             # Assert that we\'re at the start of a line
    (?![\d -]+$)  # Assert that the line consists not solely of digits, spaces and -s
                  # Assert that the line doesn\'t consist of two Uppercase Words
    (?!\s*\p{Lu}\p{L}*\s+\p{Lu}\p{L}*\s*$)
                  # Match 2-75 of the allowed characters
    [ \wåäöÅÄÖ,()%+\-:.]{2,75}
    (?<!\.)       # Assert that the last one isn\'t a dot
    $             # Assert position at the end of a line
    (?=\n)        # Assert that one newline follows.
    /mxu', 
    $subject, $result, PREG_PATTERN_ORDER);

答案 1 :(得分:0)

您需要将表达式包装在^EXPRESSION$中。这意味着您需要表达式匹配整行。如上所述,如果表达式是句点或冒号,则表达式可以忽略最后一个字符。

答案 2 :(得分:0)

针对更改后的问题进行了更新:

/(^|[\n\r]{3,}).{2,75}(?<!\.)[\n\r]+/

Example可能有文字等。

(我正在寻找\n\r,因为该页面上的编辑器似乎将换行视为\r s)

上一个答案:

/^.+[^.:\n\r]$/m

Example