我试图创建一个包含字符集的正则表达式,它可以包含句点或冒号,但不能以句点结尾。所以我想用一句台词来表达"Lorem./: Ipsom dolor sit"而不是"Lorem ipsum dolor sit."
这是我当前的正则表达式的外观,但它无法工作,因为如果字符串以句点或冒号结尾,它将匹配:
/(\n{2,})([ \wåäöÅÄÖ,()%+\-:.]{2,75}[^.:])(\n{1,})/
我在一个巨大的,格式错误的纯文本文件中寻找标题。这个文件的一般模式是一个标题前面总是有两个或更多的换行符,后面总是有一个或更多的换行符。此外,标题有时以a:结尾,但从不以a.结尾,但有时包含a.:。而且它们总是有2-75个字符长,并且从来没有在前面加上另一个标题。
任何帮助都将不胜感激。
编辑:我意识到我的解释非常糟糕和部分错误,因此更新了这篇文章。

最佳答案

通常,如果要匹配不以点结尾的字符串,只需将(?<!\.)$添加到regex的结尾。
这是一个negative lookbehind assertion
在你的特殊情况下,比赛应该在这之后继续,所以我们需要一种不同的方法:

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

将匹配任何行
接两个或多个换行符(\n{2,}),
仅包含2到75个允许字符([ \wåäöÅÄÖ,()%+\-:.]),
不会以.结尾((?<!\.)-)
并后跟至少一个换行符(\n+)。
编辑:
一个新的、扩展的regex,尝试合并下面注释中讨论的一些逻辑;格式为详细的regex:
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);

关于php - 捕获包含“。”或“:”但不以句点结尾的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4991750/

10-11 21:01