让正则表达式通过字符“读取”并停止捕获特定短语的最佳方法是什么?我用了很多时间。*?和。+?将不需要的字符传递给特定的字符串或标记,然后捕获。
我想阅读任何字符,直到我找到特定的短语或标签。我通常会做一些像
这样的事情date.*?<.*?>(\w+)<.*?>
来自一个看起来像
的字符串 datestuffstuffstuffstuff<tag>animal<tag>
这可以在一个简单的例子中工作,但引擎会丢失10K字符文本以匹配。当我进入捕获时,我需要更具体吗?正则表达式简体中文:跳过字符,直到你到达这个短语然后捕获。
答案 0 :(得分:1)
由于您在询问如何解析纯文本,我可以建议使用否定字符类,即[^
+ CHARACTERS_THAT_SHOULD_NOT_BE_MATCHED + ]
。
否定字符类是最有效的正则表达式子模式。考虑
word one#word 2#more text
#(.*?)#
将需要18个步骤才能找到匹配项,而#(\[^#\]*)#
将分6个步骤完成。
此外,.
默认情况下与换行符不匹配,您需要使用(?s)
,/s
或其他不同风格的方式指定DOTALL模式。
如果您需要在2个或更多必需字符之间匹配一些不必要的文字,那么您必须使用.*
/ .*?
(带或不带dotall修饰符),或 - 如果您需要最接近的匹配 - tempered greedy token(特别是,如果必须排除某些子字符串)。