正则表达式匹配一些角色

时间:2011-03-27 23:42:05

标签: regex performance substring

条件已更新

通常情况下,您需要提取子字符串(紧接在某些字符之前)。例如,假设您有一个文本:

  • 不以分号或句号开头,
  • 包含几个句子,
  • 不包含任何“\ n”和
  • 以句号结束,

并且您想要从最开始到最近的分号或句点提取序列。我想到了两种策略:

  1. /[^;.]*/
  2. /.*?[;.]/
  3. 我随便做了其中任何一个,略微偏向于第二个策略,并且在其他人的代码中也看到了两种方式。哪种方式更好?是否有明确的理由偏爱另一个,或者有更好的方法?我个人觉得,除了效率之外,否定某些东西(与[^]一样)在概念上比不这样做更复杂。但效率也可能是选择其中一种的好理由。

5 个答案:

答案 0 :(得分:2)

我想出了答案。在我的问题中,两个正则表达式实际上并没有表达同样的事情。更好的方法取决于你想要的。

  1. 如果您想要匹配并包含某个角色,请使用

    /.*?[;] /

  2. 更简单。

    1. 如果你想要在某个角色之前(不包括)某个角色,那么你应该使用:

      / [^ ;.] * /

答案 1 :(得分:1)

我个人更喜欢第一个,因为它完全符合您的预期。获取除...之外的所有字符

但这主要是偏好问题。几乎总有多种方法可以编写正则表达式,而且大多数风格都很重要。

例如......您更喜欢[0-9][:digit:]还是\d?他们都完全相同 *

* 如果是unicode,[:digit:]\d类也匹配其他一些字符。

答案 2 :(得分:1)

嗯,第一种方式可能更有效,而不是它可能很重要。顺便说一下,字符类中的\z 意味着“输入结束” - 实际上,这是我所知道的每种风格的语法错误。无论如何,/[^;.]*/就是你所需要的。

答案 3 :(得分:0)

我认为你使用哪种正则表达式主要是意见问题。但是,关于效率的注意事项,我认为在这种情况下将\A添加到正则表达式的开头会使进程更快,因为设计良好的正则表达式引擎在这种情况下应该只尝试匹配一次。例如:

/\A[^.;]/m

注意m选项;它表示换行符也可以匹配。这只是我为通用示例添加的技术性,但可能不适用于您。

尽管在解决方案中添加更多内容可能会被视为日益复杂,但它也可以用来澄清意义。

答案 4 :(得分:0)

你遗漏了另一个策略。字符串拆分?

"my sentence; blahblah".split(/[;.]/,2)[0]