我正在尝试创建一个包含字符集的正则表达式,该字符集可以包含句点或冒号,但可能不以句点结尾。所以我想说一句话"Lorem./: Ipsom dolor sit"
而不是"Lorem ipsum dolor sit."
这是我目前的正则表达式的样子,但它不起作用,因为如果字符串以句点或冒号结束它将匹配:
/(\n{2,})([ \wåäöÅÄÖ,()%+\-:.]{2,75}[^.:])(\n{1,})/
我正在寻找一个巨大的,格式错误的纯文本文件中的标题。此文件中的一般模式是标题始终以两个或更多的换行符开头,并且总是由一个换行符或更多换行符。此外,标题有时会在:
上结束,但永远不会在.
上结束,但它们有时会包含.
或:
。它们总是长2-75个字符,前面没有另一个标题。
非常感谢任何帮助。
编辑:我意识到我的解释非常糟糕且部分错误,因此更新了这篇文章。
答案 0 :(得分:3)
通常,如果要匹配不以点结尾的字符串,只需将(?<!\.)$
添加到正则表达式的末尾。
这是negative lookbehind assertion。
在你的特殊情况下,匹配应该在此之后继续,所以我们需要一个不同的方法:
/\n{2,}([ \wåäöÅÄÖ,()%+\-:.]{2,75}(?<!\.))\n+/
将匹配任何
行\n{2,}
),[ \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)