条件已更新
通常情况下,您需要提取子字符串(紧接在某些字符之前)。例如,假设您有一个文本:
并且您想要从最开始到最近的分号或句点提取序列。我想到了两种策略:
/[^;.]*/
/.*?[;.]/
我随便做了其中任何一个,略微偏向于第二个策略,并且在其他人的代码中也看到了两种方式。哪种方式更好?是否有明确的理由偏爱另一个,或者有更好的方法?我个人觉得,除了效率之外,否定某些东西(与[^]
一样)在概念上比不这样做更复杂。但效率也可能是选择其中一种的好理由。
答案 0 :(得分:2)
我想出了答案。在我的问题中,两个正则表达式实际上并没有表达同样的事情。更好的方法取决于你想要的。
如果您想要匹配并包含某个角色,请使用
/.*?[;] /
更简单。
如果你想要在某个角色之前(不包括)某个角色,那么你应该使用:
/ [^ ;.] * /
答案 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]