我试图创建一个包含字符集的正则表达式,它可以包含句点或冒号,但不能以句点结尾。所以我想用一句台词来表达"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/