给出字符串的正则表达式,给定开始和结束

时间:2017-06-07 17:24:22

标签: javascript regex

我想用3个参数构建一个函数:

var function = searchMyRegex(begin_marker, end_marker, text) { ... }

我需要一个RegExp,它会给出一定的字符串,给定开头和结尾,但它是我最短的版本,意味着开头和结尾都不在两个标记之间

例如

var text = "Lorem ipsum ipsum sit amet amet adipisicing elit"

如果BEGIN为ipsum且END为amet,我希望得到ipsum sit amet,而不是ipsum ipsum sit amet amet

我试图解决自己的方式是这样的:

new RegExp(begin_marker + "[^" + end_marker + "]*\ " + end_marker);

但这似乎不起作用,我不知道为什么。

1 个答案:

答案 0 :(得分:4)

你可以使用这种结构:

ipsum(?:(?!ipsum).)*?amet

(?:(?!ipsum).)*?检查ipsum之后和amet之前的每个位置是否不是其他ipsum的开头。

使用非贪婪量词*?,匹配在第一次amet出现时停止。

请注意,之前的技术需要针对每个位置执行前瞻测试。如果你处理一个长字符串,你也可以使用字符类来提高效率:

ipsum[^ia]*(?:i(?!psum)[^ia]*|a(?!met)[^ia]*)*amet

然而,动态构建此模式并不容易。

当标记是单词(即以单词字符开头和结尾)时,你可以限制使用前瞻测试的位置数量,如下所示:

\bipsum\W+(?:(?!ipsum\b)\w+\W+)*?amet\b

前瞻只在单词开头测试。这个可以很容易地动态构建。