正面展望正则表达式令人困惑

时间:2011-09-29 11:11:05

标签: php mysql regex pattern-matching expression

我正在构建这个正则表达式,并且正面向前看。基本上它必须选择行中的所有文本,直到“:”之前的句号并添加“|”最后划定它。下面是一些示例文本。我在gskinner和editpadpro中对此进行了测试,显然它具有完整的grep正则表达式支持,所以如果我能得到答案,我会很感激。

下面的正则表达式在某种程度上起作用,但我不确定它是否正确。如果文本包含括号,它也会失效。

最后我想添加另一个忽略规则,例如忽略但包含“Co”的规则在选择中。第二个忽略规则将忽略但包括在它们之前具有单个大写字母的句点。以下示例文本。感谢您的帮助。

^(?:[^|]+\|){3}(.*?)[^(?:Co)]\.(?=[^:]*?\:)

121| Ryan, T.N. |2001. |I like regex. But does it like me (2) 2: 615-631.
122| O' Toole, H.Y. |2004. |(Note on the regex). Pages 90-91 In: Ryan, A. & Toole, B.L. (Editors) Guide to the regex functionality in php. Timmy, Tommy& Stewie, Quohog. * Produced for Family Guy in Quohog.

2 个答案:

答案 0 :(得分:1)

我认为我不明白你想做什么。但是这部分[^(?:Co)]绝对不正确。

使用方括号创建一个字符类,因为^它是一个否定的类。这意味着在这个地方你不想匹配其中一个字符(?:Co),换句话说,它将匹配除“?”之外的任何其他字符。(:Co“。

<强>更新

我认为不可能。我该如何区分L.Co ..或类似的东西和句子的结尾?

但我在你的正则表达式中发现了另一个错误。最后一部分(?=[^:]*?\:)应为(?=[^.]*?\:),如果您希望将:之前的最后一个点与您在第一个点上匹配的表达式匹配。

here on Regexr

答案 1 :(得分:0)

这个似乎做你想做的事。

(.*\.)(?=[^:]*?:)

它非常简单地匹配所有文本,直到冒号前的最后一个句号。